[英]Decompress streaming BZ2 from memory in Python
我的内存中有一块CSV数据bz2压缩数据
compressed = load_from_network_service(...)
我想遍历一连串的解压线。
for line in bz2_decompress_stream(compressed):
...
是否存在这样的功能?
原则上,我可以写到磁盘,然后使用bz2.BZ2File
读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
对象在这里可能会有所帮助。 我的经验是,我给它压缩的数据,并给了我整个解压缩的结果。 它似乎没有流。 也许这是我数据的限制?
有两个不同的问题:
为了解决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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.