2011-12-06 28 views

Trả lời

0

Bạn có thể sử dụng TarFile.extractfile(member) để trích xuất tệp cụ thể.

Nó trả về một đối tượng giống filelike (Python điển hình) mà bạn có thể sử dụng để ghi nội dung vào một tệp trên bất kỳ vị trí nào bạn muốn.

+0

Điều đó sẽ làm việc, nhưng nó doesn không lưu trữ siêu dữ liệu tệp (thời gian sửa đổi, v.v.). –

2

Theo mô-đun tarfile, bạn có thể làm điều đó dễ dàng. Tôi chưa kiểm tra.

TarFile.extract(member, path="") 

Tài liệu:

Giải nén thành viên từ kho lưu trữ vào thư mục làm việc hiện tại, sử dụng tên đầy đủ của nó. Thông tin tệp của nó được trích xuất chính xác nhất có thể. thành viên có thể là tên tệp hoặc đối tượng TarInfo. Bạn có thể chỉ định một thư mục khác sử dụng đường dẫn.

Vì vậy, bạn sẽ có thể làm

TarFile.extract(member, path=".") 

Xem tài liệu đầy đủ tại địa chỉ: http://docs.python.org/library/tarfile.html

+0

Khi các tài liệu nói "với thư mục làm việc hiện tại, sử dụng tên đầy đủ của nó", "tên đầy đủ" thực sự là một đường dẫn. Họ có thể nói chính xác hơn "sử dụng đường dẫn đầy đủ của nó, bắt đầu từ thư mục làm việc hiện tại ... Bạn có thể chỉ định thư mục khởi động khác bằng đường dẫn". Vì vậy, câu trả lời này sẽ không hoạt động. Câu trả lời của ekhumoro có vẻ tốt hơn. – Weeble

7

Các thuộc tính dữ liệu của một đối tượng TarInfo đó vẫn được phép. Vì vậy, chỉ cần thay đổi name để bất cứ điều gì bạn muốn và sau đó giải nén nó:

import sys, os, tarfile 

args = sys.argv[1:] 
tar = tarfile.open(args[0]) 
member = tar.getmember(args[1]) 
member.name = os.path.basename(member.name) 
path = args[2] if len(args) > 2 else '' 
tar.extract(member, path) 
+0

+1 cho lời nhắc về 'os.path.basename()' – metasequoia

9

tôi gặp vấn đề này là tốt, và danh sách các ví dụ hoàn chỉnh dựa trên câu trả lời ekhumoro của

import os, tarfile 
output_dir = "." 
tar = tarfile.open(tar_file) 
for member in tar.getmembers(): 
    if member.isreg(): # skip if the TarInfo is not files 
    member.name = os.path.basename(member.name) # remove the path by reset it 
    tar.extract(member,output_dir) # extract 
Các vấn đề liên quan