如何使用python

时间:2017-09-19 03:55:01

标签: python bz2

如何用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)

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

编辑:

无论@metatoaster的答案还是上面的代码,它们都会将更多脏数据带入最终的解压缩文件中。 例如:我的原始数据附加在下面,并以csv格式附加名称res_test.csv: enter image description here

然后我进入文件所在的目录并用tar -cjf res_test.tar.bz2 res_test.csv压缩它并获取压缩文件res_test.tar.bz2,这个文件可以模拟我将从互联网获取的bz2数据,我希望在内存中解压缩它而不先将其缓存到磁盘中,但我得到的是下面的数据并包含太多脏数据: enter image description here

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

1 个答案:

答案 0 :(得分:2)

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

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

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

但是,假设这是一个tar文件(通常作为文件目录提取到磁盘的存档文件),可以使用tarfile模块,它具有扩展模式处理bz2的标志。假设目标文件包含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()