我在内存中有一块CSV数据bz2压缩数据
compressed = load_from_network_service(...)
我想迭代一行解压缩的行。
for line in bz2_decompress_stream(compressed):
...
这样的功能是否存在?
原则上我可以写入磁盘然后使用bz2.BZ2File
读取,这似乎只是想要使用文件名
with open('tmp', 'w') as f:
f.write(compressed)
with bz2.BZ2File('tmp') as f:
for line in f:
...
但是,对于我目前的应用程序磁盘I / O是一个优质,所以这很痛苦。
据推测,bz2.BZ2Decompressor
对象在这里可能会有所帮助。我的经验是,我给它压缩数据,它给我整个解压缩的结果;它似乎没有流。也许这是我数据的限制?
答案 0 :(得分:0)
有两个不同的问题:
为了解决2.,你可以使用bz2.BZ2Compressor
。但是1 ....的解决方案完全取决于你的第一行究竟是什么
compressed = load_from_network_service(...)
真的回归。如果compressed
是一个字符串,那么你可以做的事情并不多:你必须等到你全部检索完毕,然后解压缩。相反,如果它是一个递增的“填充”StringIO
,那么你可以做一些像(未经测试的):
decompressed = ''
while True:
compressed_chunk = compressed.read(100)
# Can be empty (even before the stream is exhausted):
decompressed_chunk = decompressor.decompress(data)
if decompressed_chunk:
decompressed += decompressed_chunk
new_lines = decompressed.splitlines()
decompressed = new_lines[-1]
for line in new_lines[:-1]:
do_something(line)
if len(chunk) < 100:
# Reached EOF
break