2012-11-26 48 views
4

我想提取一個壓縮文件夾,但不是直接使用.extractall(),而是想將文件提取到流中,以便我可以自己處理該流。是否有可能使用tarfile?或者有什麼建議嗎?python tar文件如何將文件提取到流中

+0

你的意思是'tarfile'庫嗎? –

+0

是的,抱歉的錯字錯誤 –

回答

13

您可以使用.extractfile()方法從tar文件中獲取每個文件作爲python file對象。環比tarfile.TarFile()實例來列出所有條目:

import tarfile 

with tarfile.open(path) as tf: 
    for entry in tf: # list each entry one by one 
     fileobj = tf.extractfile(entry) 
     # fileobj is now an open file object. Use `.read()` to get the data. 
     # alternatively, loop over `fileobj` to read it line by line. 
+0

如果fileobj是一個gzip文件,是否可以解壓縮它? – Werner

+1

@Werner:'tarfile'模塊爲您處理壓縮。參見['tarfile.open()'文檔](https://docs.python.org/2/library/tarfile.html#tarfile.open),默認模式是'r',它可以透明地檢測壓縮和處理根據需要進行減壓。 –

+0

是的,但在tarfile裏面我有一個gzip文件(不幸的是有人用我的gzip文件創建了一個壓縮的tarfile文件...)。 'extractfile'返回一個'tarfile.ExFileObject',它不能用來打開gzip.GzipFile。有沒有辦法打開這個gzip文件而不解壓tarfile並打開新的系統文件? – Werner

0

我無法extractfile,而網絡流tar文件,我做了這樣的事情,而不是:

from backports.lzma import LZMAFile 
import tarfile 
some_streamed_tar = LZMAFile(requests.get('http://some.com/some.tar.xz').content) 
with tarfile.open(fileobj=some_streamed_tar) as tf: 
    tarfileobj.extractall(path="/tmp", members=None) 

,並閱讀他們:

for fn in os.listdir("/tmp"): 
    with open(os.path.join(t, fn)) as f: 
     print(f.read()) 

python 2.7.13

相關問題