2011-11-04 10 views
6

私はすべてのファイルではなくtarアーカイブのサブフォルダのみを抽出する必要があるpythonプロジェクトで作業しています。 は私がtarから1つのディレクトリのみを抽出します

tar = tarfile.open(tarfile) 
tar.extract("dirname", targetdir) 

を使用しようとしました。しかし、これは動作しません、それは与えられたサブディレクトリも例外がスローされないが抽出されません。私はPythonの初心者です。 また、上記の関数がディレクトリに対して機能しない場合、このコマンドとtar.extractfile()の違いは何ですか?

+0

extractfile()ファイルをディスクに書き込みません、それはあなたに与えますPythonオブジェクト。 extract()はディスクに書き込みます。 –

答えて

11

tarfile module documentationから第二の例のビルが、あなたがこのようなものを含んでサブフォルダとそのすべての内容を抽出できます。

with tarfile.open("sample.tar") as tar: 
    subdir_and_files = [ 
     tarinfo for tarinfo in tar.getmembers() 
     if tarinfo.name.startswith("subfolder/") 
    ] 
    tar.extractall(members=subdir_and_files) 

これは、サブフォルダとその内容のリストを作成し、推奨されるextractall()メソッドを使用して、それだけを抽出します。もちろん、抽出するサブフォルダの実際のパス(tarファイルのルートからの相対パス)を"subfolder/"に置き換えてください。

4

他の答えはサブフォルダパスを保持します。つまり、subfolder/a/b./subfolder/a/bに抽出されます。 、ルートにサブフォルダを抽出するためにそうsubfolder/a/b./a/bに抽出されるだろう、あなたはこのようなものでパスを書き換えることができます。

def members(tf): 
    l = len("subfolder/") 
    for member in tf.getmembers(): 
     if member.path.startswith("subfolder/"): 
      member.path = member.path[l:] 
      yield member 

with tarfile.open("sample.tar") as tar: 
    tar.extractall(members=members(tar)) 
+0

素晴らしい作品です。 'member.path = os.path.join( 'new_dirname'、member.path [l:])'を実行することによって、このスタイルで最上位のフォルダの名前を変更することもできます。 – Blake

関連する問題