使用Python逐个读取整数

5

如何从文件中读取int?我有一个包含整数数据的大型(512MB)txt文件,格式如下:

0 0 0 10 5 0 0 140
0 20 6 0 9 5 0 0

现在如果我使用c = file.read(1),我每次只能得到一个字符,但我需要每次得到一个整数。像这样:
c = 0
c = 10
c = 5
c = 140 and so on...

希望有大佬能够帮忙。提前感谢。

3个回答

7
这里有一种方法:
with open('in.txt', 'r') as f:
  for line in f:
    for s in line.split(' '):
      num = int(s)
      print num

通过使用 for line in f,您逐位读取文件(既不使用read() all也不使用readlines)。这很重要,因为您的文件很大。
接着,您将每行按空格拆分,并在读取时读取每个数字。
您可以进行更多的错误检查,以防止文件包含损坏的数据。如注释所述,这对您来说应该足够了-否则,如果您的文件可能具有极长的行,则可以像一次读取多个块这样做得更巧妙些。

如果每行都是由空格分隔的数字,那么这是最简单的方法。逐行处理...没有混乱,没有麻烦。真的没有必要一次读取一个字节。 - jdi
1
如果他只有一行,我认为他可能会跳出内存。 - Arkadiusz 'flies' Rzadkowolski
这太棒了。请问一下,文件中是否包含制表符而不是空格? - whoone
@whoone 在 Python 提示符下,输入 print str.split.__doc__。这会给你一些有关 split 如何工作的信息。提示:那里的文档为你提供了如何同时处理制表符和空格的线索。 - azhrei
是的,我明白了。非常感谢 :) - whoone

2

512 MB 的空间并不算很大。如果你无论如何都要创建数据列表,那么一次性进行读取步骤应该也没有问题:

my_int_list = [int(v) for v in open('myfile.txt').read().split()]

如果您能够对代码进行结构化,以便不需要将整个列表存储在内存中,则最好使用生成器:

def my_ints(fname):
    for line in open(fname):
        for val in line.split():
            yield int(val)

然后使用它:

for c in my_ints('myfile.txt'):
    # do something with c (which is the next int)

我会小心谨慎地对待“512 MB并不是很大”的评论。如果文件看起来像示例数据,那么在那个512MB的文件中有很多数字,大约有2亿个数字。你的代码所做的是读入512MB的数据,然后创建一个由2亿个字符串组成的列表,然后遍历该列表以创建一个由2亿个整数组成的列表。考虑到Python对象需要比原始数据更多的空间,这可能会使用几个G的内存。 - daniel kullmann
@danielkullmann,事实证明,在你耗尽内存之前,你会遇到字符串split()函数能够处理的大小限制问题。例如,请求前50个单词open('input.txt').read()[:2**25].split(' ', 50)对我有效,而一个“稍微”长一点的前缀open('input.txt').read()[:2**26].split(' ', 50)则会引发MemoryError错误。 - thebjorn

-2
我会这样做:
  • buffer = file.read(8192)
  • contents += buffer
  • 按空格拆分输出字符串
  • 从数组中删除最后一个元素(可能不是完整的数字)
  • 用最后一个元素的字符串替换内容
  • 重复以上步骤,直到缓冲区为 None

如果操作数确实有巨大的行,我喜欢这个。 - jdi
1
为什么是8192字节?如果你正在处理分块读取,按磁盘块大小(或内存页大小)读取不是更自然吗?此外,你的提纲遗漏了文件中的最后一个int。 - thebjorn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接