ฉันจะสร้างไฟล์. tar.gz ด้วยการบีบอัดใน Python ได้อย่างไร
ฉันจะสร้างไฟล์. tar.gz ด้วยการบีบอัดใน Python ได้อย่างไร
คำตอบ:
ในการสร้าง.tar.gz
(aka .tgz
) สำหรับแผนผังไดเร็กทอรีทั้งหมด:
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))
นี้จะสร้างเก็บ tar gzipped source_dir
มีโฟลเดอร์ระดับบนสุดที่เดียวที่มีชื่อเดียวกันและเนื้อหาเป็น
arcname=os.path.basename(source_dir)
มันจะให้โครงสร้างเส้นทางทั้งหมดของsource_dir
ไฟล์ tar (ในสถานการณ์ส่วนใหญ่อาจไม่สะดวก)
arcname=os.path.basename(source_dir)
ยังคงหมายความว่าไฟล์เก็บถาวรมีโฟลเดอร์ที่มีเนื้อหาของไฟล์source_dir
. หากคุณต้องการให้รูทของไฟล์เก็บถาวรมีเนื้อหาในตัวเองไม่ใช่เนื้อหาภายในโฟลเดอร์ให้ใช้arcname=os.path.sep
แทน
os.path.sep
ที่เก็บถาวรจะมีบริการ "" หรือโฟลเดอร์ "/" ซึ่งโดยปกติแล้วไม่ใช่ปัญหา แต่บางครั้งอาจเป็นปัญหาได้หากคุณประมวลผลที่เก็บถาวรนี้ในภายหลังโดยใช้โปรแกรม ดูเหมือนว่าวิธีเดียวที่สะอาดจริงๆคือการทำos.walk
และเพิ่มไฟล์ทีละไฟล์
arcname='.'
ไฟล์. ไม่จำเป็นต้องใช้os.walk
.
import tarfile
tar = tarfile.open("sample.tar.gz", "w:gz")
for name in ["file1", "file2", "file3"]:
tar.add(name)
tar.close()
หากคุณต้องการสร้างไฟล์บีบอัด tar.bz2 ให้แทนที่ชื่อนามสกุลไฟล์ด้วย ".tar.bz2" และ "w: gz" ด้วย "w: bz2"
with tarfile.open( ..
ใน Python แทนการโทรopen
และclose
ด้วยตนเอง นอกจากนี้ยังเป็นกรณีเมื่อเปิดไฟล์ปกติ
คุณเรียกtarfile.openโดยมีmode='w:gz'
ความหมายว่า "เปิดสำหรับการเขียนแบบบีบอัด gzip"
คุณอาจต้องการปิดท้ายชื่อไฟล์ ( name
อาร์กิวเมนต์ถึงopen
) ด้วย.tar.gz
แต่จะไม่ส่งผลต่อความสามารถในการบีบอัด
BTW คุณมักจะได้รับการบีบอัดที่ดีกว่าด้วยโหมด'w:bz2'
เช่นเดียวกับที่tar
สามารถบีบอัดได้ดีbzip2
กว่าที่สามารถบีบอัดgzip
ได้
คำตอบก่อนหน้านี้แนะนำให้ใช้tarfile
โมดูล Python เพื่อสร้าง.tar.gz
ไฟล์ใน Python เห็นได้ชัดว่าเป็นโซลูชันที่ดีและเป็นสไตล์ Python แต่มีข้อเสียเปรียบอย่างมากในเรื่องความเร็วในการเก็บถาวร คำถามนี้กล่าวว่าtarfile
ช้ากว่าtar
ยูทิลิตี้ใน Linux ประมาณสองเท่า จากประสบการณ์ของฉันการประมาณนี้ค่อนข้างถูกต้อง
ดังนั้นเพื่อการเก็บถาวรที่เร็วขึ้นคุณสามารถใช้tar
คำสั่งโดยใช้subprocess
โมดูล:
subprocess.call(['tar', '-czf', output_filename, file_to_archive])
ในไฟล์ tar.gz นี้บีบอัดในไดเร็กทอรีมุมมองแบบเปิดในการแก้ปัญหาให้ใช้ os.path.basename (file_directory)
with tarfile.open("save.tar.gz","w:gz"):
for file in ["a.txt","b.log","c.png"]:
tar.add(os.path.basename(file))
ใช้ในไฟล์ tar.gz บีบอัดในไดเรกทอรี
นอกจากคำตอบของ @Aleksandr Tukallo แล้วคุณยังสามารถรับผลลัพธ์และข้อความแสดงข้อผิดพลาด (หากเกิดขึ้น) การบีบอัดโฟลเดอร์ที่ใช้tar
จะมีการอธิบายสวยดีในคำตอบต่อไปนี้
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()}")