在Python

时间:2015-05-09 16:01:54

标签: python compression bzip2

我在内存中有一块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对象在这里可能会有所帮助。我的经验是,我给它压缩数据,它给我整个解压缩的结果;它似乎没有流。也许这是我数据的限制?

1 个答案:

答案 0 :(得分:0)

有两个不同的问题:

  1. 不写入磁盘
  2. 为了解决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