2011-11-24 6 views
7

私は、特定のディレクトリで抽出する必要のあるディレクトリがあるtarアーカイブを持っています。 例えば:抽出/ /このディレクトリ:私は、私は例えば特定のターゲットディレクトリにそれを抽出したいtarアーカイブ内のディレクトリ指定されたディレクトリ内のディレクトリパスを持つすべてのファイルを抽出します。

TarPrefix/X/Y/Z

を持っていますディレクトリTarPrefix/x/y/zに含まれるすべてのファイルとディレクトリを含む必要があります。

subdir_and_files = [ tarinfo for tarinfo in tar.getmembers() 
         if tarinfo.name.startswith("subfolder/") 
        ] 

は「/サブフォルダ」ディレクトリパス内のすべてのメンバーのリストを取得し、その後、私はそれが tar.extractall(extracted/a,subdir_and_files) を使用して抽出するが、それは例えば、そのディレクトリ・パスですべてのメンバーを抽出し、この結果、抽出に//x/y/z。 指定されたフォルダにこれらのファイルを抽出するのを手伝ってください。あなたはすでに答えを見つけたかもしれないよう

+0

私は知らないが、この質問は、ソートあなたの反対であるように思わします。http: //stackoverflow.com/questions/2239655/python-tarfile-adding-files-without-directory-hiearchy extractall()ではなくextractall()を使用して、TarInfoオブジェクトを変更してsubdir_and_filesに入っていますか? –

+1

初心者のご質問をおねがいします。私はpythonの初心者ですし、なぜそのような質問を尋ねられたのGoogle上の任意の答えが見つかりませんでした。他人を助けるために私はこの質問に答えたい。 tarinfo.name属性の値を正しい値に変更するだけで済みます。すなわち私の与えられた例では 'tarinfo.name = tarinfo.name [len(Tarprefix/x/y/z):]'となり、その後同じコードを使用します。 – gaurav

+0

私は自分の質問に答えようとしましたが、私は8時間まで許可されていないので、それまで待っていました。 – gaurav

答えて

12

は見えるが、ここで私のバージョンは、とにかくだ:

import sys, tarfile 

def get_members(tar, prefix): 
    if not prefix.endswith('/'): 
     prefix += '/' 
    offset = len(prefix) 
    for tarinfo in tar.getmembers(): 
     if tarinfo.name.startswith(prefix): 
      tarinfo.name = tarinfo.name[offset:] 
      yield tarinfo 

args = sys.argv[1:] 

if len(args) > 1: 
    tar = tarfile.open(args[0]) 
    path = args[2] if len(args) > 2 else '.' 
    tar.extractall(path, get_members(tar, args[1])) 
+0

助けてくれてありがとう。ええ、私はものを試して答えを見つけました:)。とにかくありがとう。 – gaurav

2
with tarfile.open('sourcefile.tgz', 'r:gz') as _tar: 
    for member in _tar: 
     if member.isdir(): 
     continue 
     fname = member.name.rsplit('/',1)[1] 
     _tar.makefile(member, 'desination_dir' + '/' + fname) 
+0

あなたの答えについて何か説明してください。 – Satendra

関連する問題