2011-11-24 42 views
7

Tôi có một kho lưu trữ tar trong đó tôi có một thư mục mà tôi cần trích xuất trong một thư mục nhất định. Ví dụ: Tôi có một thư mụcTrích xuất tất cả các tệp có đường dẫn thư mục trong thư mục đã cho

TarPrefix/x/y/z

trong một kho lưu trữ tar tôi muốn trích xuất nó trong một thư mục đích cho ví dụ: chiết xuất/A/thư mục này nên chứa tất cả các tệp và thư mục chứa trong thư mục TarPrefix/x/y/z.

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

để có được danh sách của tất cả các thành viên trong đường dẫn thư mục "thư mục con /" và sau đó tôi giải nén nó bằng cách sử tar.extractall(extracted/a,subdir_and_files) nhưng nó trích xuất toàn bộ các thành viên với đường dẫn thư mục của họ Ví dụ kết quả này trong chiết xuất/A/XYZ. Bạn có thể vui lòng giúp tôi trong việc trích xuất các tệp này trong thư mục đã cho hay không.

+0

Tôi không biết, nhưng câu hỏi này có vẻ là loại trái ngược với bạn: http: //stackoverflow.com/questions/2239655/python-tarfile-adding-files-without-directory-hiearchy Có lẽ bạn có thể sử dụng extract() thay vì extractall() và xem những gì bạn có thể làm cho xảy ra, có thể bằng cách sửa đổi các đối tượng TarInfo bạn có trong subdir_and_files? –

+1

Xin lỗi vì đã hỏi câu hỏi của người mới bắt đầu. Tôi là một người mới bắt đầu trong python và không tìm thấy bất kỳ câu trả lời trên google đó là lý do tại sao hỏi một câu hỏi như vậy. Để giúp đỡ người khác, tôi muốn trả lời câu hỏi này. Bạn chỉ cần thay đổi giá trị thuộc tính tarinfo.name thành giá trị chính xác. tức là trong ví dụ đã cho của tôi 'tarinfo.name = tarinfo.name [len (Tarprefix/x/y/z):]' và sau đó sử dụng cùng một mã hoạt động. – gaurav

+0

Tôi đã cố gắng trả lời câu hỏi của riêng mình nhưng tôi không được phép cho đến tám giờ nên chờ đến lúc đó. – gaurav

Trả lời

12

Hình như bạn có thể đã tìm thấy một câu trả lời, nhưng đây là phiên bản của tôi anyway:

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

Cảm ơn bạn đã giúp đỡ. Ya tôi tìm thấy câu trả lời bằng cách thử nghiệm với các công cụ :). Dù sao cảm ơn rất nhiều. – 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

mô tả điều gì đó về câu trả lời của bạn. – Satendra

Các vấn đề liên quan