Câu trả lời:
Để xây dựng .tar.gz
(hay còn gọi là .tgz
) cho toàn bộ cây thư mục:
import tarfile
import os.path
def make_tarfile(output_filename, source_dir):
with tarfile.open(output_filename, "w:gz") as tar:
tar.add(source_dir, arcname=os.path.basename(source_dir))
Thao tác này sẽ tạo một kho lưu trữ tar được gzipped chứa một thư mục cấp cao nhất có cùng tên và nội dung như source_dir
.
arcname=os.path.basename(source_dir)
thì nó sẽ cung cấp cho bạn toàn bộ cấu trúc đường dẫn của source_dir
tệp tar (trong hầu hết các trường hợp, điều đó có thể bất tiện).
arcname=os.path.basename(source_dir)
vẫn có nghĩa là kho lưu trữ chứa một thư mục chứa nội dung của source_dir
. Nếu bạn muốn gốc của kho lưu trữ chứa chính nội dung chứ không phải nội dung trong thư mục, hãy sử dụng arcname=os.path.sep
thay thế.
os.path.sep
, thì kho lưu trữ sẽ chứa dịch vụ "." hoặc thư mục "/" thường không phải là vấn đề, nhưng đôi khi nó có thể là vấn đề nếu sau đó bạn xử lý tệp lưu trữ này theo chương trình. Có vẻ như cách duy nhất thực sự rõ ràng là thực hiện os.walk
và thêm các tệp riêng lẻ
arcname='.'
. Không cần sử dụng os.walk
.
import tarfile
tar = tarfile.open("sample.tar.gz", "w:gz")
for name in ["file1", "file2", "file3"]:
tar.add(name)
tar.close()
Nếu bạn muốn tạo tệp nén tar.bz2, chỉ cần thay thế tên phần mở rộng tệp bằng ".tar.bz2" và "w: gz" bằng "w: bz2".
with tarfile.open( ..
bằng Python, thay vì gọi open
và close
thủ công. Đây cũng là trường hợp khi mở các tệp thông thường.
Bạn gọi tarfile.open với mode='w:gz'
, nghĩa là "Mở để viết nén gzip."
Có thể bạn sẽ muốn kết thúc tên tệp ( name
đối số là open
) bằng .tar.gz
, nhưng điều đó không ảnh hưởng đến khả năng nén.
BTW, bạn thường nén tốt hơn với một chế độ 'w:bz2'
, giống như tar
có thể thường nén thậm chí tốt hơn với bzip2
chế độ nén gzip
.
Các câu trả lời trước khuyên bạn nên sử dụng tarfile
mô-đun Python để tạo .tar.gz
tệp bằng Python. Đó rõ ràng là một giải pháp tốt và kiểu Python, nhưng nó có nhược điểm nghiêm trọng về tốc độ lưu trữ. Câu hỏi này đề cập đến tarfile
tốc độ chậm hơn khoảng hai lần so với tar
tiện ích trong Linux. Theo kinh nghiệm của tôi ước tính này là khá chính xác.
Vì vậy, để lưu trữ nhanh hơn, bạn có thể sử dụng tar
lệnh sử dụng subprocess
mô-đun:
subprocess.call(['tar', '-czf', output_filename, file_to_archive])
Ngoài câu trả lời của @Aleksandr Tukallo, bạn cũng có thể nhận được đầu ra và thông báo lỗi (nếu xảy ra). Nén một thư mục bằng cách sử dụng tar
được giải thích khá tốt trong câu trả lời sau đây .
import traceback
import subprocess
try:
cmd = ['tar', 'czfj', output_filename, file_to_archive]
output = subprocess.check_output(cmd).decode("utf-8").strip()
print(output)
except Exception:
print(f"E: {traceback.format_exc()}")