基础知识是我需要每行处理4gig文本文件。
使用.readline()或f中的行很适合内存,但需要很长时间才能使用IO。想要使用像yield这样的东西,但是(我认为)会破坏线条。
可能的答案:
file.readlines([sizehint])¶
因此阅读。如果是可选的sizehint 参数存在,而不是 阅读EOF,全线 总计近似sizehint字节 (可能在四舍五入到之后 读取内部缓冲区大小)。 实现文件类的对象 界面可以选择忽略 sizehint如果无法实现, 或无法有效实施。Read until EOF using readline() and return a list containing the lines
没意识到你能做到这一点!
答案 0 :(得分:7)
您可以遍历文件对象:
with open("filename") as f:
for line in f:
whatever
这将进行一些内部缓冲以提高性能。 (请注意,file.readline()
将执行相当差的因为它不缓冲 - 这就是为什么你不能将文件对象与file.readline()
混合在一起的原因。)
答案 1 :(得分:0)
如果你想在每行上做一些事情,你可以循环遍历文件对象:
f = open("w00t.txt")
for line in f:
# do stuff
然而,按行进行操作可能是性能的实际瓶颈,所以也许您应该使用更好的块大小?你可以做的是,例如,读取4096字节,找到结束\n
的最后一行,处理该部分并将剩下的部分添加到下一个块。
答案 2 :(得分:0)
你总是可以把线条组合起来?我的意思是为什么打开一个文件并在你可以打开同一个文件6次并迭代时一直迭代。 e.g。
a #is the first 1024 bytes
b #is the next 1024
#etcetc
f #is the last 1024 bytes
每个文件句柄在一个单独的进程中运行,我们开始烹饪燃气。请记住正确处理行结尾。