2011-11-04 35 views
6

Tôi đang làm việc trên một dự án trong python mà tôi cần trích xuất chỉ một thư mục con của kho lưu trữ tar không phải tất cả các tệp. Tôi đã cố gắng sử dụngTrích xuất chỉ một thư mục duy nhất từ ​​tar

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

Nhưng điều này không có tác dụng, nó không trích xuất thư mục con nhất định cũng không ngoại lệ được ném. Tôi là người mới bắt đầu trong python. Ngoài ra, nếu hàm trên không hoạt động đối với các thư mục thì khác biệt giữa lệnh này và tar.extractfile() là gì?

+0

extractfile() không viết một tập tin vào đĩa, nó chỉ mang đến cho bạn một đối tượng python. extract() ghi vào đĩa. –

Trả lời

11

Dựa trên ví dụ thứ hai từ tarfile module documentation, bạn có thể trích xuất các thư mục con chứa và tất cả các nội dung của nó với một cái gì đó như thế này:

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) 

Điều này tạo ra một danh sách các thư mục con và nội dung của nó, và sau đó sử dụng phương thức được đề xuất extractall() để chỉ trích xuất chúng. Tất nhiên, thay thế "subfolder/" bằng đường dẫn thực tế (liên quan đến thư mục gốc của tệp tar) của thư mục con bạn muốn trích xuất.

4

Câu trả lời khác sẽ giữ lại đường dẫn thư mục con, nghĩa là subfolder/a/b sẽ được trích xuất thành ./subfolder/a/b. Để giải nén một thư mục con vào thư mục gốc, vì vậy subfolder/a/b sẽ được trích ra để ./a/b, bạn có thể viết lại những con đường với một cái gì đó như thế này:

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

Hoạt động tuyệt vời. Bạn cũng có thể đổi tên thư mục cấp cao nhất với kiểu này bằng cách thực hiện 'member.path = os.path.join ('new_dirname', member.path [l:])' – Blake

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