[英]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.