【问题标题】:Read lines containing integers from a file in Python?从 Python 文件中读取包含整数的行?
【发布时间】:2012-07-06 00:55:20
【问题描述】:

我有这样的文件格式:

9 8 1
3 4 1
...
...

现在,我想将每一行作为三个整数。

我用的时候

for line in f.readlines():
    print line.split(" ")

脚本打印了这个:

['9', '8', '1\r\n']
['3', '4', '1\r\n']
...
...

如何将每一行作为三个整数?

【问题讨论】:

  • 你的意思是for line in f.readlines():
  • 不要施放。转变。更普遍的问题是:“如何将 '123' 转换为相应的数字 123?”

标签: python file-io casting


【解决方案1】:

使用您拥有的代码并解决如何将列表转换为整数的具体问题:

您可以遍历每一行并将字符串转换为int,以下示例使用list comprehension

给定:

line =['3', '4', '1\r\n']

然后:

int_list = [int(i) for i in line]

将产生一个整数列表

[3, 4, 1]

然后您可以通过下标(0 到 2)访问。例如

int_list[0] 包含3

int_list[1] 包含4

等等


更精简的版本供您考虑:

with open('data.txt') as f:
    for line in f:
        int_list = [int(i) for i in line.split()]
        print int_list

使用with 的好处是它会在您完成或遇到异常时自动为您关闭文件。

更新

根据您下面的 cmets,如果您想要 3 个不同变量中的数字,例如 abc,您可以执行以下操作:

   for line in f:
       a, b, c = [int(i) for i in line.split()]
       print 'a = %d, b = %d, c = %d\n' %(a, b, c)

然后得到这个:

    a = 9, b = 8, c = 1

这取决于每行有 3 个数字。

旁白:

请注意,您还可以使用这种形式的“生成器表达式”(GE)来代替“列表理解”(LC):

    a, b, c = (int(i) for i in line.split())

对于您的 3 个整数的特殊问题,这并没有太大的区别,但为了完整起见,我将其展示出来。对于较大的问题,LC需要更多的内存,因为它会一次在内存中生成一个完整的列表,而GE则根据需要一个一个地生成一个值。如果您好奇,这个 SO question Generator Expressions vs. List Comprehension 将为您提供更多信息。

【讨论】:

  • 实际上,我没有足够的声望投票。投票需要至少 15 声望。如果我想使用数据来构建图形数据结构,将它们格式化为列表是一个不好的选择。有没有一些简单的方法可以将它们格式化为三个单个整数?
  • @sezina 你不需要任何分数来接受答案。这是这个答案旁边的小复选标记。
  • @Levon:它不起作用。我有一个ValurError: need more then 2 values to unpack
  • @sezina 检查你的数据文件,确保它每行只包含 3 个数字,并且没有空行(在文件末尾)。我在发布之前用文件测试了这段代码,所以它可以工作。当您在一行中少于 3 个项目时,会出现此消息。在这种情况下,一行中必须只有 2 个项目。
  • @Levon:啊哈。我解决了这个问题。非常感谢。我接受了。
【解决方案2】:
with open("myfile.txt") as f:
    for line in f:
        int_list = [int(x) for x in line.split()]

你没有说你想对整数列表做什么,可能有更好的方法来迭代它们,这取决于。

如果您“需要将值作为三个不同的变量”,那么”

a, b, c = int_list

虽然你也可以使用:

int_list[0]
int_list[1]
int_list[2]

根据需要。

【讨论】:

  • 请注意 - .strip() 是多余的
  • 谢谢。如果我想使用数据来构建图形数据结构,将它们格式化为列表是一个不好的选择。有没有一些简单的方法可以将它们格式化为三个单个整数?
  • @JonClements:确实如此,我删除了它。
  • @sezina:我们需要更多详细信息来了解如何帮助您构建图表。
  • @NedBatchelder:我需要将值作为三个不同的变量来获取。
【解决方案3】:
line.strip().split(" ") 

会的。

更完整,一个大字符串中的所有行都完好无损:

data = f.read().strip()    # loose final \n
[ int(x.split(" ")) for x in data.split('\n')]

会给你一个列表,每行都有你想要的答案。

【讨论】:

    【解决方案4】:

    如果您想将整数存储在三个变量中:

    with open('data1.txt') as f:
        for line in f:
            a,b,c=(int(x) for x in line.split()) 
            print a,b,c 
    

    输出:

    9 8 1
    3 4 1
    

    【讨论】:

      【解决方案5】:

      这段代码应该可以解决你的问题:

      f = open(filepath)
      for line in f:
          intList = map(int, line.strip().split())
          print intList
      f.close()
      

      【讨论】:

        猜你喜欢
        • 2012-07-07
        • 1970-01-01
        • 1970-01-01
        • 2015-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多