我正在处理一个巨大的 .7z 文件,我需要逐行处理它。
首先我尝试了
py7zr
,但它只能通过首先将整个文件解压缩到一个对象中来工作。这会耗尽内存。
然后
libarchive
能够逐块读取,但是没有直接的方法将这些二进制块拆分成行。
我能做什么?
我先研究的相关问题:
我正在寻找方法来改进我自己构建的临时解决方案 - 在此处作为答案发布。谢谢!
此解决方案遍历所有可用的
get_blocks()
。如果最后一行没有以\n
结尾,我们将剩余的字节保留为下一个块中的yield
。
import libarchive
def process(my_file):
data = ''
with libarchive.file_reader(my_file) as e:
for entry in e:
for block in entry.get_blocks():
data += block.decode('ISO-8859-1')
lines = data.splitlines()
if not data.endswith('\n'):
data = lines.pop()
else:
data = ''
for line in lines:
yield ({'l': line},)