【发布时间】:2013-06-08 00:39:16
【问题描述】:
我想了解在 python 中读取大文件时这些方法在 RAM 使用方面的差异。
第 1 版,在 stackoverflow 上找到:
def read_in_chunks(file_object, chunk_size=1024):
while True:
data = file_object.read(chunk_size)
if not data:
break
yield data
f = open(file, 'rb')
for piece in read_in_chunks(f):
process_data(piece)
f.close()
第2版,在找到上面的代码之前我用过这个:
f = open(file, 'rb')
while True:
piece = f.read(1024)
process_data(piece)
f.close()
文件在两个版本中都被部分读取。并且可以处理当前的一块。在第二个示例中,piece 在每个周期都获取新内容,所以我认为这样做无需将完整文件加载到内存中即可完成工作。
但我真的不明白yield 做了什么,而且我很确定我这里出了点问题。谁能给我解释一下?
除了使用的方法之外,还有一些让我感到困惑的事情:
我读到的那篇文章的内容是由块大小定义的,在上面的例子中是 1KB。但是...如果我需要在文件中查找字符串怎么办? "ThisIsTheStringILikeToFind" 之类的东西?
根据字符串在文件中出现的位置,可能有一段包含"ThisIsTheStr" 部分,而下一段将包含"ingILikeToFind"。使用这种方法不可能检测到任何片段中的整个字符串。
有没有办法分块读取文件 - 但不知何故关心这些字符串?
【问题讨论】:
-
你可以把第一个片段写成
for chunk in iter(partial(f.read, chunk_size), b""): process_data(chunk)(假设是二进制模式)。最后一个问题的答案是肯定的:只需检查块是否以字符串的任何前缀结尾,下一个块是否以相应的后缀开头。 -
感谢您提及
iter- 不知道!关于第二个问题:您的意思是我可以检查文章是否以T或Th或Thi或This结尾- 等等?嗯,好主意!谢谢!