1

如何用python解压内存中的*.bz2文件?bz2 文件来自 csv 文件。

我使用下面的代码在内存中解压它,它可以工作,但是它带来了一些脏数据,例如 csv 文件的文件名和它的作者姓名,还有其他更好的方法来处理它吗?

#!/usr/bin/python
# -*- coding: utf-8 -*-
import StringIO
import bz2


with open("/app/tmp/res_test.tar.bz2", "rb") as f:
    content = f.read()

    compressedFile = StringIO.StringIO(content)
    decompressedFile = bz2.decompress(compressedFile.buf)
    compressedFile.seek(0)

    with open("/app/tmp/decompress_test", 'w') as outfile:
        outfile.write(decompressedFile)

我发现了这个问题,它在 gzip 中,但是我的数据是 bz2 格式的,我尝试按照其中的说明进行操作,但似乎 bz2 无法以这种方式处理它。

编辑:

不管@metatoaster 的回答还是上面的代码,都会给最终解压后的文件带来更多的脏数据。例如:我的原始数据附在下面,格式为 res_test.csv: 在此处输入图像描述

然后我 cd 进入文件所在的目录并使用它进行压缩tar -cjf res_test.tar.bz2 res_test.csv并获取压缩文件 res_test.tar.bz2,该文件可以模拟我将从 Internet 获取的 bz2 数据,我希望将其解压缩到内存中而不缓存它首先进入磁盘,但我得到的是下面的数据并且包含太多脏数据: 在此处输入图像描述

数据仍然存在,但淹没在噪声中,是否可以将其解压缩为与原始数据一样的纯数据,而不是将其解压缩并从过多的噪声中提取真实数据?

4

1 回答 1

3

对于通用 bz2 解压缩,BZ2File可以使用类。

from bz2 import BZ2File
with BZ2File("/app/tmp/res_test.tar.bz2") as f:
    content = f.read()

content应该包含文件的解压缩内容。

但是,鉴于这是一个tar文件(通常作为文件目录提取到磁盘的存档文件),tarfile可以使用该模块,并且它具有用于处理 bz2 的扩展模式标志。假设目标文件包含 a res_test.csv,可以使用以下内容

tf = tarfile.open('/app/tmp/res_test.tar.bz2', 'r:bz2')
csvfile = tf.extractfile('res_test.csv').read()

r:bz2标志以一种可以向后搜索的方式打开 tar 存档,这很重要,因为替代方法r|bz2使得从它返回的成员中调用提取文件是不切实际的extractfile。第二行简单地调用以从存档文件中以字符串extractfile形式返回 的内容。'res_test.csv'

但是,通常建议使用透明打开模式 ( 'r:*'),因此如果使用 gzip 压缩输入 tar 文件,则不会遇到故障。

自然地,该tarfile模块具有open可用于任意流对象的较低级别的方法。如果文件已经使用已经打开BZ2File,也可以使用

with BZ2File("/app/tmp/res_test.tar.bz2") as f:
    tf = tarfile.open(fileobj=f, mode='r:')
    csvfile = tf.extractfile('res_test.csv').read()
于 2017-09-19T04:00:28.453 回答