在Python中处理大文本文件
基本情况是,我需要逐行处理4GB的文本文件。
使用.readline()或者for line in f这种方式对内存友好,但在输入输出(IO)上花费的时间很长。我想用类似yield的方式,但我觉得那样会把行切割开。
可能的答案:
file.readlines([sizehint])¶
Read until EOF using readline() and return a list containing the lines
因此可以读取。如果提供了可选的sizehint参数,那么就不是读取到文件末尾,而是读取大约sizehint字节的完整行(可能会向上调整到内部缓冲区的大小)。实现了类似文件接口的对象可能会选择忽略sizehint,如果它无法实现,或者无法高效实现的话。
没想到你可以这样做!
3 个回答
0
你可以把文件的内容分成小块来处理吗?我的意思是,为什么要打开一个文件然后一行一行地读取,而不干脆打开同一个文件六次,然后分别读取呢?
a #is the first 1024 bytes
b #is the next 1024
#etcetc
f #is the last 1024 bytes
每个文件的处理都是在不同的进程中运行,这样效率就会提高。只要记得要正确处理行结束符就可以了。
1
如果你想逐行处理文件,可以直接对文件对象进行循环:
f = open("w00t.txt")
for line in f:
# do stuff
不过,逐行处理可能会导致性能问题,所以你可能需要考虑使用更合适的块大小。比如,你可以先读取4096个字节,然后找到最后一个换行符 \n
,处理这一部分内容,再把剩下的部分放到下一个块中继续处理。
7
你可以直接对文件对象进行遍历:
with open("filename") as f:
for line in f:
whatever
这样做会进行一些内部的缓存,以提高性能。(注意,file.readline()
的表现会差很多,因为它没有缓存——这就是为什么你不能把遍历文件对象和 file.readline()
混在一起用的原因。)