【问题标题】:How would I go about converting parts of a string read-in from a file to an int [duplicate]我将如何将部分字符串从文件读入转换为 int [重复]
【发布时间】:2014-05-24 20:40:51
【问题描述】:

我开始研究 python,但我目前停留在这个概念上,它很难解释,所以我将使用一个例子。

例子:

我有一个 txt 文件,其中包含: 法国,210026,63929000,1.15

我已经想出了如何拆分元素并将它们添加到列表中。但我想将数字添加为浮点数,将国家名称添加为字符串。

目前我做的是:

inf = []
with open('small.txt', 'r') as inputFile:
    for line in inputFile:
        line = line.strip()
        if line != '':
            info += line.split(',')
print info

输出是:

['法国', '210026' , '63929000', '1.15']

如您所见,这是一个字符串列表。我真正想要的是只有法国是字符串,其余的应该是花车。有任何想法吗?

谢谢

【问题讨论】:

    标签: python


    【解决方案1】:

    如果您通常希望输入中的所有行都采用相同格式,您可以尝试以该格式读取它们,也许要注意最终格式错误的行

    info = []
    with open('small.txt', 'r') as inputFile:
        for line in inputFile:
            line = line.strip()
            if line != '':
                try:
                    (a,b,c,d) = [ll.strip() for ll in line.split(',')] 
                    info.append([a, int(b), int(c), float(d)])
                except IOError as (errno, strerror):
                    print "I/O error %s: %s" % (errno, strerror)
                except ValueError:
                    print "Malformed line:" + line
                except:
                    print "Unexpected error:", sys.exc_info()[0]
                    raise
    

    【讨论】:

    • 你不应该使用除语句之外的毯子。在这种情况下写除了 ValueError 会好很多。
    • 好点,改变了 try/except 块
    • 越来越好......你仍然不应该使用毯子,除非。如果您正在寻找除StandardError 之外的全部尝试,否则您将捕获KeyboardInterrupt、SystemExit 等。修复它,我将删除我的反对票:)
    【解决方案2】:

    这里有几个选项,一个选项是尝试将每个元素转换为浮点数并处理任何异常以将非浮点值保留为字符串:

    info = []
    with open('small.txt', 'r') as inputFile:
        for line in inputFile:
            line = line.strip()
            if line != '':
                fields = line.split(',')
                for i, x in enumerate(fields):
                    try:
                        fields[i] = float(x)
                    except ValueError:
                        pass
                info += fields
    print info
    

    或者,如果您对文件格式有信心,您可以从索引 1(国家之后)开始转换:

    info = []
    with open('small.txt', 'r') as inputFile:
        for line in inputFile:
            line = line.strip()
            if line != '':
                fields = line.split(',')
                fields[1:] = map(float, fields[1:])
                info += fields
    print info
    

    附带说明,您确定要使用info += ... 而不是info.append(...)?这里的不同之处在于,使用+=,您将拥有一个平面列表,而使用append,每行的数据将位于其自己的内部列表中(例如[['France', 1.0, 2.0, 3.0], ['England', 4.0, 5.0, 6.0]])。

    【讨论】:

    • 是的,确实,append 将给定行中的列表(或元组)添加为一个元素,而 += 将扩展原始列表。
    【解决方案3】:
    data = []
    with open('small.txt','r') as inputFile:
        for line in inputFile:
            line = line.strip()
            if not line: continue # if the line is empty, skip the rest
            info = []
            for element in line.split(","):
                try:
                    info.append(float(element))
                except ValueError:
                    info.append(element)
            data.append(info)
    

    这将尝试将每个元素转换为float(即带有小数部分的数字,如@9​​87654323@)。如果float(element) 失败(就像"France" 一样,因为"France" 显然不是一个数字),它会抛出一个ValueError,所以我们抓住它并使用字符串代替。

    【讨论】:

      【解决方案4】:

      我将建议您定义一个函数来尝试将值转换为浮点数,然后在拆分结果上调用 map。这可能比目前提出的其他解决方案更简洁。

      def to_float(value):
          try:
              return float(value)
          except ValueError:
              return value
      
      with open('small.txt') as data_file:
          for row in data_file:
              fields = map(to_float, row.strip().split(','))
              print fields
      

      另一种解决方案是使用 csv 模块,让它为您处理转换。这当然要求 CSV 文件中作为字符串的所有内容都用引号引起来。如果您可以获取该格式的文件,那就太好了。您可以通过将 quoting=csv.QUOTE_NONNUMERIC 传递给阅读器的构造函数来完成此操作。

      import csv
      
      with open('small.txt') as data_file:
          csv_reader = csv.reader(data_file, delimiter='\t',
                                  quoting=csv.QUOTE_NONNUMERIC)
      
          for row in csv_reader:
              print row #results will be floats if not quoted
      

      【讨论】:

        猜你喜欢
        • 2020-07-27
        • 2015-06-02
        • 1970-01-01
        • 2015-06-18
        • 2017-05-07
        • 1970-01-01
        • 2012-01-24
        • 2013-11-04
        • 2021-12-25
        相关资源
        最近更新 更多