繁体   English   中英

如何使用python解压缩内存中的.tar.bz2

[英]how to decompress .tar.bz2 in memory with python

如何使用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的答案还是上面的代码,它们都将把更多的脏数据带入最终的解压缩文件中。 例如:我的原始数据以csv格式附在下面,名称为res_test.csv: 在此处输入图片说明

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

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

对于通用的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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM