Python中的大文件处理
我正在用python做一些文件操作。我使用的是python版本python 3.5.2。 我有一个4GB的大文件。我正在读文件,比如2KB 我有一个疑问。 如果任何2KB块恰好在2行换行之间的中间行,则该行被截断,或者半读行的内容被返回?Python中的大文件处理,python,file,Python,File,我正在用python做一些文件操作。我使用的是python版本python 3.5.2。 我有一个4GB的大文件。我正在读文件,比如2KB 我有一个疑问。 如果任何2KB块恰好在2行换行之间的中间行,则该行被截断,或者半读行的内容被返回? -关于,是的,这是一个问题。您可以通过一个小得多的测试看到: s = io.BytesIO(b'line\nanother line\nanother\n') while True: buf = s.read(10) if not buf: b
-关于,是的,这是一个问题。您可以通过一个小得多的测试看到:
s = io.BytesIO(b'line\nanother line\nanother\n')
while True:
buf = s.read(10)
if not buf: break
print('*** new buffer')
for line in buf.splitlines():
print(line.decode())
输出为:
*** new buffer
line
anoth
*** new buffer
er line
an
*** new buffer
other
如您所见,第一个缓冲区有一个截断的部分行,在下一个缓冲区中结束,这正是您所担心的。事实上,这种情况不仅会偶尔发生,而且大多数时候都会发生
解决方案是在旧缓冲区的最后一行之后保留溢出,并将其用作新缓冲区的一部分。您应该尝试自己编写代码,以确保您理解它,记住在文件末尾打印剩余溢出
但好消息是,您很少需要这样做,因为Python文件对象会为您这样做:
s = io.BytesIO(b'line\nanother line\nanother\n')
for line in s:
print(line.decode(), end='')
就这样。您可以使用openpath中的真实文件“rb”代替BytesIO来测试这一点,它也可以正常工作。Python将一次读入一个页面,一行一行地生成,自动为您处理所有棘手的事情。如果关于一个页面不够好,可以使用更明确的方法,例如,将buffering=2048传递给open函数
事实上,你可以做得更好。在文本模式下打开文件,Python仍然会一次读入大约一个页面,将其分成几行,并在运行中为您解码,这可能比您想出的任何方法都要高效:
for line in open(path):
print(line, end='')
你编码了什么吗?是的,这是个问题;如果您一次只读取2K,并将内容分成几行,则需要保持上一个缓冲区的溢出,以便连接到下一个缓冲区的开始。但好消息是Python中的内置文件对象已经为您完成了这项工作。只需对文件中的行执行以下操作:,它将缓冲所有内容,处理溢出,一次只给您一行,而不会在内存中读取超过一页的内容。@RafiGoldfarb不。我想这更多是一个理论上的疑问。@abarnert:谢谢您的澄清。但是一次阅读每一行,这不会消耗很多时间吗?相反,我搜索一些东西,比如:读取2KB的块。或者上一行,如果您担心性能问题,请编写并测试它。在封面下,它会将一个很好的最佳数量读入缓冲区,快速地将内容拆分成行,在不使用原始方式的额外副本的情况下进行溢出,并生成行。对于许多特殊情况,你可以想出比这更快的方法,但是你需要解释你的特殊情况是什么。例如,有时答案是re over mmap,但在其他情况下,这是一个糟糕的答案。