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

标签 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

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

数据还在,但淹没在噪音中,是否可以将其解压为与原始数据一样的纯数据,而不是解压并从太多噪音中提取真实数据?

最佳答案

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

关于python - 如何用python解压内存中的.tar.bz2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46291529/

相关文章:

python - 在 Django-seed 中生成 mobile_number 时出错

python - Pyodbc executemany 只返回插入的最后一个元素

python - 递归删除偶数相邻重复字母的代码

python - 如何使用 Python 解析 WIkidata JSON (.bz2) 文件?

Java Wget Bz2 文件

bz2 - 如何为Linux下载bzip2源代码?

android - 构建 Python 3.7 时 bz2 模块失败

python - celery worker 不工作虽然 rabbitmq 有队列建立

python - 检查域名是否注册

java - 我如何在 Android 上用 Java 提取 bz2 文件?