Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的大文件处理_Python_File - Fatal编程技术网

Python中的大文件处理

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

我正在用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: 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,但在其他情况下,这是一个糟糕的答案。