gpt4 book ai didi

python - 分块读取文件 - RAM 使用,从二进制文件中读取字符串

转载 作者:太空狗 更新时间:2023-10-29 19:36:00 25 4
gpt4 key购买 nike

我想了解在 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 的作用,而且我很确定我在这里弄错了。谁能给我解释一下?


除了使用的方法,还有一点让我不解:

我读的那篇文章的内容是用chunk-size定义的,在上面的例子中是1KB。但是...如果我需要在文件中查找字符串怎么办?像 "ThisIsTheStringILikeToFind" 这样的东西?

根据字符串在文件中出现的位置,一段可能包含 "ThisIsTheStr" 部分 - 而下一段将包含 "ingILikeToFind"。使用这种方法不可能在任何片段中检测到整个字符串。

有没有办法分 block 读取文件 - 但不知何故关心这样的字符串?

最佳答案

yield 是 python 中用于生成器表达式的关键字。这意味着下次调用(或迭代)该函数时,执行将在您上次调用它时停止的确切位置重新开始。这两个函数的行为相同;唯一的区别是第一个使用的调用堆栈空间比第二个多一点。但是,第一个的可重用性要高得多,因此从程序设计的角度来看,实际上第一个更好。

编辑:另外,另一个区别是第一个将在所有数据都被读取后停止读取,这是应该的方式,但第二个只会停止一次 f.read()process_data() 抛出异常。为了让第二个正常工作,你需要像这样修改它:

f = open(file, 'rb')
while True:
piece = f.read(1024)
if not piece:
break
process_data(piece)
f.close()

关于python - 分块读取文件 - RAM 使用,从二进制文件中读取字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17056382/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com