2011-11-24 26 views
7

Belirli bir dizinde ayıklamam gereken bir dizinin bulunduğu bir tar arşivim var. Örnek: ekstre/a /, bu dizin: I, örneğin belirli bir hedef dizine çıkarmak istediğiniz bir tar bir dizinBelirtilen dizinde dizin yolu ile tüm dosyaları ayıkla

TarPrefix/x/y/z

sahip TarPrefix/x/y/z dizininde bulunan tüm dosya ve dizinleri içermelidir.

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

"/ alt klasör" dizindeki bütün üyelerin listesini almak için ve sonra ben onu tar.extractall(extracted/a,subdir_and_files) kullanarak ayıklamak ama Örneğin kendi dizin yolu ile tüm üyelerini ayıklar bu sonuçları çıkarılan/a/x/y/z. Bu dosyaları belirtilen klasörde ayıklamada bana yardımcı olabilir misiniz? Zaten bir cevap bulmuş olabilir gibi

+0

Bilmiyorum, ama bu soru çeşit senin karşısındaki gibi görünüyor: http: //stackoverflow.com/questions/2239655/python-tarfile-adding-files-without-directory-hiearchy Belki de extractall() yerine extract() kullanabilir ve muhtemelen ne yaptığınızı görebilir, muhtemelen TarInfo nesnelerini değiştirerek subdir_and_files içinde var mı? –

+1

Yeni başlayanların sorusu için üzgünüz. Python'da yeni başlayan biriyim ve google'da herhangi bir cevap bulamadı, bu yüzden böyle bir soru soruldu. Başkalarına yardım etmek için bu soruya cevap vermek istiyorum. Sadece tarinfo.name özellik değerini doğru değere değiştirmeniz gerekir. yani verdiğim örnekte tarinfo.name = tarinfo.name [len (Tarprefix/x/y/z):] 've daha sonra aynı kodu kullanmaktadır. – gaurav

+0

Kendi sorumu cevaplamaya çalıştım ama sekiz saate kadar beklemedim, o zamana kadar bekledi. – gaurav

cevap

12

görünüyor, ama burada benim sürüm zaten var:

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

Yardımlarınız için teşekkürler. Ya cevapları bulup deneyerek buldum :). Her neyse çok teşekkürler. – 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

cevabınız hakkında bir şeyler açıklar. – Satendra

İlgili konular