2016-05-19 12 views
1

私はいくつかの他のtarアーカイブを含むtarアーカイブを持っています。次の例では、主要な.tarファイルを完全に抽出していますが、他の.tarファイルに問題が発生しています。.tarファイル内の.tarファイルへのアクセス

import tarfile 
import os 

fd = tarfile.open('test.tar') 
for member in fd.getmembers(): 
    if not member.isfile(): 
     continue 

    cfile = fd.extractfile(member) 
    name = cfile.name 
    filename, file_extension = os.path.splitext(name) 
    #print filename + "----" + file_extension 

    if file_extension == ".tar": 
     print cfile 
    #print cfile.read() 
    print cfile.name 
    cfile.close() 
fd.close() 

これには次の値を返します。

file1.txt 
file2.txt 
<tarfile.ExFileObject object at 0x101989690> 
tar1.tar 

だから私はtar1.tarファイルオブジェクトを取得することができます。しかし、私はtar1.tarからメンバーやコンテンツを取得する方法を考えることができません。

+0

...あなたがメインのtarファイルのためにそれをやっているのと同じ方法? – kindall

+0

はい、私はそれを試みましたが、 'getmembers()' doesntは 'tarfile.ExFileObject'オブジェクトのために終了します – user1513388

+0

あなたはそれを再帰的にやってみるかもしれません。あなたはpython2または3を使用していますか?あなたが私にそのファイルへのアクセス権を与えるなら、私はそれにショットをつけてコードを掲示することができます。 – JeanPaulDepraz

答えて

1

fileobjパラメータとしてcfileを渡して、tarfile.open()を新規に呼び出します。

import tarfile 
import os 

def list_contents(name, fileobj=None, prefix=''): 
    fd = tarfile.open(name, fileobj=fileobj) 
    for member in fd.getmembers(): 
     if not member.isfile(): 
      continue 
     cfile = fd.extractfile(member) 
     name = cfile.name 
     filename, file_extension = os.path.splitext(name) 
     print prefix + cfile.name 
     if file_extension == '.tar': 
      list_contents(name, cfile, prefix+' ') 
     cfile.close() 
    fd.close 

list_contents('x.tar') 

テスト:

$ touch a b c x y z 
$ tar cf y.tar x y z 
$ tar cf x.tar a b y.tar c 
$ python t.py 
a 
b 
y.tar 
    x 
    y 
    z 
c 
+0

ありがとうパーフェクト! - ファイルパス/名前に基づいて各ファイルのコンテンツを選択的に取得したい場合は、これを行う方法がありますか? – user1513388

+0

これを行うためのコードを追加できると確信しています。試してみる。あなたが立ち往生したら、いつでも[so]の別の質問をすることができます! –

関連する問題