簡體   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