Solusi kuat Python untuk mengarsipkan dan membuat zip File

Pengarsipan dan kompresi file adalah tugas penting di dunia digital, memungkinkan penyimpanan dan transfer data dalam jumlah besar secara efisien.

Artikel ini akan mengeksplorasi bagaimana Python menyederhanakan proses ini dengan pustaka bawaannya, zipfile dan tarfile. Selanjutnya, kami akan membandingkan metode kompresi yang ditawarkan oleh kedua perpustakaan untuk memahami kekuatan dan kelemahannya.

Di akhir tutorial ini, Anda akan dapat membuat, mengekstrak, dan memanipulasi file arsip dalam berbagai format menggunakan Python sambil juga mengetahui pilihan metode kompresi.

Semua contoh tersedia di perpustakaan GitHub ini.

Memanfaatkan perpustakaan zipfile Python untuk kompresi

Pustaka file zip bawaan Python memungkinkan Anda bekerja dengan arsip ZIP dengan lancar. Bagian ini akan membahas penggunaan perpustakaan ini untuk membuat, mengekstrak, menambah, dan membaca metadata dari file ZIP.

Membaca metadata dari arsip ZIP

Pertama, kita akan membaca metadata dari arsip ZIP yang ada. Membaca metadata dari arsip ZIP melibatkan penggunaan pustaka zipfile bawaan Python. Metadata dapat mencakup detail seperti nama file, ukuran file, dan waktu modifikasi terakhir.

Contoh di bawah ini menunjukkan cara membuka arsip ZIP, membaca metadatanya, dan menampilkan informasi untuk setiap file dalam arsip.

Kami menggunakan manajer konteks ZipFile di fungsi main untuk membuka file meta.zip. Objek zip_file menyediakan metode infolist, yang mengembalikan daftar berisi objek ZipInfo untuk semua file dalam meta.zip.

Selanjutnya, kita mengulangi semua objek ZipInfo dan menampilkan metadata setiap file menggunakan fungsi print_metadata. Metadata yang disajikan terdiri dari nama file, ukuran kompresi, tanggal dan waktu terakhir diubah, serta ukuran file.

import zipfile

def print_metadata(file_info):
    file_name = file_info.filename
    file_size = file_info.file_size
    compressed_size = file_info.compress_size
    l_mod = file_info.date_time
    l_mod_date = f"{l_mod[0]:02d}-{l_mod[1]:02d}-{l_mod[2]:02d}"
    l_mod_time = f"{l_mod[3]:02d}:{l_mod[4]:02d}:{l_mod[5]:02d}"

    compression_ratio = compressed_size / file_size if file_size > 0 else 0

    print(f"File Name: {file_name}")
    print(f"File Size: {file_size} bytes")
    print(f"Compressed Size: {compressed_size} bytes")
    print(f"Last Modified: {l_mod_date} {l_mod_time}")
    print(f"Compression Ratio: {compression_ratio:.2%}\n")

def main():
    # Open the ZIP archive in read mode
    with zipfile.ZipFile('meta.zip', 'r') as zip_file:
        # Iterate through the files in the archive
        for file_info in zip_file.infolist():
            print_metadata(file_info)

if __name__ == "__main__":
    main()

Saat kita menjalankan contoh, ini menghasilkan keluaran berikut.

Membuat arsip ZIP

Sekarang, mari kita periksa cara membuat arsip ZIP menggunakan perpustakaan zipfile dengan Python. Membuat arsip ZIP melibatkan pembuatan arsip baru atau memperbarui arsip yang sudah ada dengan menambahkan atau memodifikasi file. Proses ini penting untuk mengompresi banyak file menjadi satu file yang lebih kecil, sehingga bermanfaat untuk penyimpanan dan distribusi.

Dalam contoh ini, fungsi create_zip_archive menggunakan input_folder dan output_file sebagai argumen. Fungsi ini membuka arsip ZIP baru dengan nama file keluaran yang ditentukan dalam mode tulis 'w' dan menggunakan metode kompresi ZIP_DEFLATED.

Ia kemudian menelusuri struktur direktori folder masukan, menambahkan setiap file ke arsip dengan jalur relatifnya. Ini memastikan bahwa struktur folder dipertahankan dalam arsip ZIP.

import zipfile
import os

def create_zip_archive(input_folder, output_file):
    with zipfile.ZipFile(output_file, 'w', zipfile.ZIP_DEFLATED) as zip_file:
        for root, dirs, files in os.walk(input_folder):
            for file in files:
                file_path = os.path.join(root, file)
                print(f"Adding {file_path} to {output_file}")
                zip_file.write(file_path,
                               os.path.relpath(file_path, input_folder))

def main():
    input_folder = 'example_folder'
    output_file = 'example_archive.zip'

    create_zip_archive(input_folder, output_file)

if __name__ == "__main__":
    main()

Contohnya menggunakan metode kompresi zipfile.ZIP_DEFLATE. Pustaka zipfile di Python mendukung tiga metode kompresi dan satu metode yang menyimpan file tanpa kompresi.

  1. zipfile.ZIP_STORED: Metode ini menyimpan file tanpa kompresi apa pun. Ini adalah metode default ketika tidak ada metode kompresi yang ditentukan. File diarsipkan tanpa mengurangi ukurannya, yang dapat berguna ketika menangani file yang sudah dikompresi seperti file gambar atau video di mana kompresi lebih lanjut tidak akan menghasilkan pengurangan ukuran yang signifikan.
  2. zipfile.ZIP_DEFLATED: Metode ini menggunakan algoritma DEFLATE untuk mengompresi file dalam arsip. DEFLATE adalah metode kompresi yang paling banyak digunakan dalam arsip ZIP, menyeimbangkan kecepatan dan efisiensi kompresi dengan baik. Anda harus memiliki modul zlib yang tersedia di instalasi Python Anda untuk menggunakan kompresi DEFLATE.
  3. zipfile.ZIP_BZIP2: Metode ini menggunakan algoritma BZIP2 untuk mengompresi file dalam arsip. BZIP2 umumnya menawarkan rasio kompresi yang lebih baik daripada DEFLATE namun bisa lebih lambat. Untuk menggunakan kompresi BZIP2, Anda harus memiliki modul bz2 di instalasi Python Anda.
  4. zipfile.ZIP_LZMA: Metode ini menggunakan algoritma LZMA untuk mengompresi file arsip. LZMA dapat memberikan rasio kompresi yang lebih baik daripada DEFLATE dan BZIP2, terutama untuk file yang lebih besar, namun biasanya lebih lambat. Untuk menggunakan kompresi LZMA, Anda harus memiliki modul lzma yang tersedia di instalasi Python Anda.

Setelah mempelajari pembuatan arsip ZIP, sekarang mari kita fokus pada mengekstraksi file terkompresi dari arsip.

Mengekstrak file dari arsip ZIP

Bagian ini akan mempelajari cara mengambil file dari arsip ZIP, memungkinkan akses ke data asli yang tidak terkompresi.

Pada contoh di bawah, fungsi extract_zip_archive mengambil input_file (arsip ZIP) dan output_folder (tujuan file yang diekstrak) sebagai argumen. Fungsi ini membuka arsip ZIP dalam mode baca 'r' dan mengekstrak semua file ke folder keluaran yang ditentukan.

import zipfile

def extract_zip_archive(input_file, output_folder):
    with zipfile.ZipFile(input_file, 'r') as zip_file:
        zip_file.extractall(output_folder)

def main():
    input_file = 'example_archive.zip'
    output_folder = 'extracted_files'

    extract_zip_archive(input_file, output_folder)

if __name__ == "__main__":
    main()

Dalam contoh terakhir, kami mendemonstrasikan cara menambahkan file ke arsip ZIP yang sudah ada, sehingga memungkinkan perluasan konten arsip.

Menambahkan file ke arsip ZIP yang ada

Saat bekerja dengan arsip ZIP, sering kali diperlukan modifikasi konten dengan menambahkan file baru. Di bagian ini, kita akan menjelajahi proses penambahan file ke arsip ZIP yang ada, sehingga memungkinkan perluasan dan pembaruan dengan mudah

Dalam contoh di bawah, fungsi add_file_to_zip_archive mengambil input_file (file yang akan ditambahkan) dan archive_file (arsip ZIP yang ada) sebagai argumen. Fungsi ini membuka arsip ZIP dalam mode penambahan 'a' dengan metode kompresi ZIP_DEFLATED dan menulis file masukan ke arsip, mempertahankan nama dasarnya.

import zipfile
import os

def add_file_to_zip_archive(input_file, archive_file):
    with zipfile.ZipFile(archive_file, 'a', zipfile.ZIP_DEFLATED) as zip_file:
        zip_file.write(input_file, os.path.basename(input_file))

def main():
    input_file = 'new_file.txt'
    archive_file = 'example_archive.zip'

    add_file_to_zip_archive(input_file, archive_file)

if __name__ == "__main__":
    main()

Dengan contoh ini, kita mengakhiri eksplorasi perpustakaan zipfile dan sekarang akan beralih ke pemeriksaan perpustakaan tarfile untuk menangani arsip TAR.

Menguasai Arsip dengan Perpustakaan tarfile Python

Arsip TAR, kependekan dari “tape archive”, adalah format file yang menggabungkan beberapa file dan direktori ke dalam satu file dengan tetap menjaga struktur file dan metadata. Arsip TAR biasanya digunakan untuk pencadangan dan distribusi file, sehingga memudahkan pengemasan sekelompok file untuk transportasi atau penyimpanan.

Pustaka tarfile dengan Python adalah modul bawaan yang memungkinkan Anda membuat, membaca, dan mengekstrak arsip TAR dengan mudah. Ini mendukung format kompresi seperti gzip, bzip2, dan lzma, yang dapat digunakan dengan TAR untuk membuat arsip terkompresi dengan ekstensi seperti .tar.gz, .tar.bz2, atau .tar.xz.

Mirip dengan penjelajahan kita pada perpustakaan zipfile, kita akan mulai dengan memeriksa metadata file tar. Setelah ini, kita akan mempelajari cara membuat arsip TAR, mengekstrak file darinya, dan pada akhirnya menambahkan file ke arsip TAR yang ada.

Membaca metadata dari arsip TAR

Contoh ini akan mendemonstrasikan cara membaca metadata dari arsip tar menggunakan pustaka tarfile bawaan Python. Metadata mencakup informasi seperti nama file, ukuran file, dan waktu modifikasi terakhir.

Script terdiri dari tiga bagian utama: metode print_metadata, metode read_tar_metadata, dan metode main. Seperti halnya file zip, kami menggunakan pengelola konteks di fungsi read_tar_metadata.

import tarfile
import time

def print_metadata(file_info):
    file_name = file_info.name
    file_size = file_info.size
    last_modified = file_info.mtime

    last_modified_str = time.strftime('%Y-%m-%d %H:%M:%S',
                                      time.localtime(last_modified))

    print(f"File Name: {file_name}")
    print(f"File Size: {file_size} bytes")
    print(f"Last Modified: {last_modified_str}\n")

def read_tar_metadata(tar_path):
    with tarfile.open(tar_path, 'r') as tar_file:
        for file_info in tar_file.getmembers():
            print_metadata(file_info)

def main():
    tar_path = 'meta.tgz'
    read_tar_metadata(tar_path)

if __name__ == '__main__':
    main()

Saat kita menjalankan contoh, ini menghasilkan keluaran berikut.

Membuat arsip TAR

Sekarang, mari kita jelajahi cara membuat arsip TAR menggunakan pustaka tarfile dengan Python. Membuat arsip TAR melibatkan pembuatan arsip baru atau memperbarui arsip yang sudah ada dengan menambahkan atau memodifikasi file. Proses ini sangat penting untuk menggabungkan beberapa file menjadi satu file gabungan, yang bermanfaat untuk penyimpanan dan distribusi.

Dalam contoh, kami menggunakan fungsi tarfile.open dengan mode 'w:gz' untuk secara langsung membuat arsip TAR terkompresi, yang biasa disebut tarball. Tarball mewakili file TAR yang telah mengalami kompresi untuk mengurangi ukuran.

import tarfile

def create_gzipped_tar_archive(tar_path, file_paths):
    with tarfile.open(tar_path, 'w:gz') as tar_file:
        for file_path in file_paths:
            tar_file.add(file_path, arcname=file_path)

def main():
    tar_path = 'example.tgz'
    file_paths = ['file1.txt', 'file2.txt', 'file3.txt']

    create_gzipped_tar_archive(tar_path, file_paths)
    print(f"{tar_path} created with the files: {', '.join(file_paths)}")

if __name__ == '__main__':
    main()

Pustaka tarfile di Python mendukung beberapa mode untuk membuka file TAR dengan algoritma kompresi berbeda. Opsi kompresi utama meliputi:

  1. Kompresi gzip: Untuk membuka file TAR dengan kompresi gzip, gunakan mode 'w:gz' (untuk menulis) atau 'r:gz' (untuk membaca). Arsip yang dihasilkan akan memiliki ekstensi .tar.gz atau .tgz.
  2. Kompresi bzip2: Untuk membuka file TAR dengan kompresi bzip2, gunakan mode 'w:bz2' (untuk menulis) atau 'r:bz2' (untuk membaca). Arsip yang dihasilkan akan memiliki ekstensi .tar.bz2 atau .tbz2.
  3. Kompresi lzma (juga dikenal sebagai kompresi xz): Untuk membuka file TAR dengan kompresi lzma, gunakan mode 'w:xz' (untuk menulis) atau 'r:xz' (untuk membaca). Arsip yang dihasilkan akan memiliki ekstensi .tar.xz atau .txz.

Mengekstrak file dari arsip TAR

Kami sekarang akan mengambil file dari arsip TAR, memungkinkan akses ke data asli yang tidak terkompresi.

Pada contoh di bawah, fungsi extract_tar_archive mengambil input_file (arsip TAR) dan output_folder (tujuan file yang diekstraksi) sebagai argumen. Fungsi ini membuka arsip TAR dalam mode baca 'r' dan mengekstrak semua file ke folder keluaran yang ditentukan.

import tarfile

def extract_tar_archive(tar_path, output_path):
    with tarfile.open(tar_path, 'r') as tar_file:
        tar_file.extractall(output_path)

def main():
    tar_path = 'example.tgz'
    output_path = 'extracted_files'

    extract_tar_archive(tar_path, output_path)
    print(f"Files from {tar_path} have been extracted to {output_path}")

if __name__ == '__main__':
    main()

Contoh terakhir kami menunjukkan cara menambahkan file ke arsip TAR yang sudah ada.

Menambahkan file ke arsip TAR yang ada

Dalam contoh terakhir ini, kita mendefinisikan fungsi add_file_to_tar_archive yang mengambil dua argumen masukan: jalur file TAR yang akan diubah (tar_path) dan jalur file yang akan ditambahkan (file_path).

Kami membuka arsip TAR dalam mode penambahan di dalam fungsi menggunakan fungsi tarfile.open(). Kami menggunakan pernyataan with untuk memastikan bahwa arsip TAR ditutup secara otomatis setelah mengeksekusi blok kode.

Selanjutnya, kita memanggil metode add() dari objek TarFile, meneruskan file_path sebagai argumen. Parameter arcname disetel ke nama file asli dalam contoh ini.

import tarfile

def add_file_to_tar_archive(tar_path, file_path):
    with tarfile.open(tar_path, 'a') as tar_file:
        tar_file.add(file_path, arcname=file_path)

def main():
    tar_path = 'example.tar'
    file_path = 'file4.txt'

    add_file_to_tar_archive(tar_path, file_path)
    print(f"{file_path} added to {tar_path}")

if __name__ == '__main__':
    main()

Dengan contoh terakhir ini, kita telah membahas berbagai operasi terkait arsip TAR dengan Python, termasuk membuat, mengekstraksi, dan memperbarui arsip.

Memilih Format Pengarsipan yang Tepat

Melalui berbagai contoh yang telah kami bahas, kami telah mendemonstrasikan cara mengarsipkan dan mengekstrak file menggunakan pustaka zipfile dan tarfile Python. Pustaka canggih ini memudahkan penanganan file ZIP dan TAR. Sekarang, Anda mungkin bertanya-tanya tentang perbedaan antara format arsip ini dan mana yang lebih sesuai dengan kebutuhan Anda.

Saat memilih antara format ZIP dan TAR, pertimbangkan faktor-faktor berikut:

Kompatibilitas: ZIP mungkin merupakan pilihan yang lebih baik jika Anda perlu berbagi arsip di berbagai platform karena kompatibilitasnya yang luas.

Kompresi: Kedua format dapat berfungsi dengan baik jika Anda memerlukan kompresi yang efisien. Ingatlah bahwa Anda harus mengompresi file TAR menggunakan alat eksternal untuk membuat tarball.

Pelestarian metadata: Jika pelestarian metadata file sangat penting, TAR mungkin merupakan pilihan yang lebih baik, terutama ketika bekerja dengan sistem Unix dan mirip Unix.

Akses acak: Jika Anda perlu sering mengekstrak file individual, ZIP memberikan solusi yang lebih efisien karena kemampuan akses acaknya.

Kesimpulannya, pilihan Anda antara format ZIP dan TAR bergantung pada kasus penggunaan dan persyaratan spesifik Anda. Evaluasi faktor-faktor yang disebutkan di atas untuk menentukan format mana yang paling sesuai dengan kebutuhan Anda.

Kesimpulan

Artikel ini telah memberikan panduan komprehensif tentang cara bekerja dengan arsip ZIP dan TAR menggunakan pustaka zipfile dan tarfile bawaan Python.

Kami telah mendemonstrasikan berbagai operasi, termasuk membuat, mengekstraksi, dan memperbarui arsip serta membaca metadata dari file yang diarsipkan.

Meskipun format ZIP dan TAR menawarkan keuntungan berbeda, pilihan Anda pada akhirnya bergantung pada kasus penggunaan dan persyaratan spesifik Anda.

Faktor-faktor seperti kompatibilitas, kompresi, pelestarian metadata, dan akses acak harus dipertimbangkan ketika mengambil keputusan.

Dengan memahami kekuatan dan kelemahan setiap format dan memanfaatkan kekuatan pustaka bawaan Python, Anda dapat mengelola data dalam jumlah besar secara efisien, mengoptimalkan penyimpanan, dan meningkatkan transfer data dalam proyek Anda.

Semua contoh tersedia di perpustakaan GitHub ini.

Konten lainnya di PlainEnglish.io.

Daftar ke buletin mingguan gratis kami. Ikuti kami di "Twitter", "LinkedIn", "YouTube", dan "Discord" .

Tertarik untuk meningkatkan skala startup perangkat lunak Anda? Lihat "Sirkuit".