จะสร้างไฟล์ tar ที่บีบอัดแบบเต็มโดยใช้ Python ได้อย่างไร


108

ฉันจะสร้างไฟล์. tar.gz ด้วยการบีบอัดใน Python ได้อย่างไร


16
tar ไม่บีบอัดข้อมูลเพียงแค่รวมไฟล์เข้าด้วยกัน มันเป็น gzip ที่บีบอัดจริง
Ignacio Vazquez-Abrams

คำตอบ:


187

ในการสร้าง.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มีโฟลเดอร์ระดับบนสุดที่เดียวที่มีชื่อเดียวกันและเนื้อหาเป็น


31
เช่นเดียวกับหมายเหตุสำหรับผู้อ่านหากคุณไม่สนใจarcname=os.path.basename(source_dir)มันจะให้โครงสร้างเส้นทางทั้งหมดของsource_dirไฟล์ tar (ในสถานการณ์ส่วนใหญ่อาจไม่สะดวก)
Brōtsyorfuzthrāx

12
บันทึกที่สอง; การใช้arcname=os.path.basename(source_dir)ยังคงหมายความว่าไฟล์เก็บถาวรมีโฟลเดอร์ที่มีเนื้อหาของไฟล์source_dir. หากคุณต้องการให้รูทของไฟล์เก็บถาวรมีเนื้อหาในตัวเองไม่ใช่เนื้อหาภายในโฟลเดอร์ให้ใช้arcname=os.path.sepแทน
Jonathan H

2
@Sheljohn น่าเสียดายที่นี่ไม่ถูกต้องทั้งหมดเพราะถ้ามีคนใช้os.path.sepที่เก็บถาวรจะมีบริการ "" หรือโฟลเดอร์ "/" ซึ่งโดยปกติแล้วไม่ใช่ปัญหา แต่บางครั้งอาจเป็นปัญหาได้หากคุณประมวลผลที่เก็บถาวรนี้ในภายหลังโดยใช้โปรแกรม ดูเหมือนว่าวิธีเดียวที่สะอาดจริงๆคือการทำos.walkและเพิ่มไฟล์ทีละไฟล์
The Godfather

หากต้องการกำจัดโครงสร้างไดเรกทอรีทั้งหมดให้ใช้arcname='.'ไฟล์. ไม่จำเป็นต้องใช้os.walk.
edouardtheron

86
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"


10
คุณควรใช้with tarfile.open( ..ใน Python แทนการโทรopenและcloseด้วยตนเอง นอกจากนี้ยังเป็นกรณีเมื่อเปิดไฟล์ปกติ
Jonathan H

31

คุณเรียกtarfile.openโดยมีmode='w:gz'ความหมายว่า "เปิดสำหรับการเขียนแบบบีบอัด gzip"

คุณอาจต้องการปิดท้ายชื่อไฟล์ ( nameอาร์กิวเมนต์ถึงopen) ด้วย.tar.gzแต่จะไม่ส่งผลต่อความสามารถในการบีบอัด

BTW คุณมักจะได้รับการบีบอัดที่ดีกว่าด้วยโหมด'w:bz2'เช่นเดียวกับที่tarสามารถบีบอัดได้ดีbzip2กว่าที่สามารถบีบอัดgzipได้


6
โปรดทราบสั้น ๆ ว่าชื่อไฟล์สำหรับ tarball ที่บีบอัด bzip2 ควรลงท้ายด้วย ".tar.bz2"
Ignacio Vazquez-Abrams

9

คำตอบก่อนหน้านี้แนะนำให้ใช้tarfileโมดูล Python เพื่อสร้าง.tar.gzไฟล์ใน Python เห็นได้ชัดว่าเป็นโซลูชันที่ดีและเป็นสไตล์ Python แต่มีข้อเสียเปรียบอย่างมากในเรื่องความเร็วในการเก็บถาวร คำถามนี้กล่าวว่าtarfileช้ากว่าtarยูทิลิตี้ใน Linux ประมาณสองเท่า จากประสบการณ์ของฉันการประมาณนี้ค่อนข้างถูกต้อง

ดังนั้นเพื่อการเก็บถาวรที่เร็วขึ้นคุณสามารถใช้tarคำสั่งโดยใช้subprocessโมดูล:

subprocess.call(['tar', '-czf', output_filename, file_to_archive])

0

ในไฟล์ 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 บีบอัดในไดเรกทอรี


0

นอกจากคำตอบของ @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()}")       
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.