Cara membuat dan memanipulasi arsip tar menggunakan python

Cara membuat dan memanipulasi arsip tar menggunakan python

Di Linux dan sistem operasi seperti UNIX lainnya, TAR tidak diragukan lagi salah satu utilitas pengarsipan yang paling banyak digunakan; Biarkan kita membuat arsip, sering disebut "Tarballs", kita dapat menggunakan untuk tujuan distribusi kode sumber atau cadangan. Dalam tutorial ini kita akan melihat cara membaca, membuat, dan memodifikasi arsip tar dengan python, menggunakan Tarfile modul.

Dalam tutorial ini Anda akan belajar:

  • Mode di mana arsip tar dapat dibuka menggunakan modul tarfile
  • Apa kelas Tarinfo dan Tarfile dan apa yang mereka wakili
  • Cara mendaftarkan konten arsip tar
  • Cara mengekstrak konten arsip tar
  • Cara menambahkan file ke arsip tar


Persyaratan dan konvensi perangkat lunak yang digunakan

Persyaratan Perangkat Lunak dan Konvensi Baris Perintah Linux
Kategori Persyaratan, konvensi atau versi perangkat lunak yang digunakan
Sistem Distribusi-independen
Perangkat lunak Python3
Lainnya Pengetahuan Dasar Python3 dan Pemrograman Berorientasi Objek
Konvensi # - mensyaratkan perintah linux yang diberikan untuk dieksekusi dengan hak istimewa root baik secara langsung sebagai pengguna root atau dengan menggunakan sudo memerintah
$ - mensyaratkan perintah Linux yang diberikan untuk dieksekusi sebagai pengguna biasa

Penggunaan dasar

Itu Tarfile Modul termasuk dalam pustaka standar Python, jadi kami tidak perlu menginstalnya secara terpisah; Untuk menggunakannya, kita hanya perlu "mengimpor". Cara yang disarankan untuk mengakses tarball menggunakan modul ini adalah oleh membuka fungsi; Dalam penggunaannya yang paling mendasar, kita harus menyediakan, sebagai argumen pertama dan kedua:

  • Nama tarball yang ingin kami akses
  • Mode di mana ia harus dibuka

"Mode" yang digunakan untuk membuka arsip tar tergantung pada tindakan yang ingin kami lakukan dan pada jenis kompresi (jika ada) yang digunakan. Mari kita lihat mereka bersama.

Membuka arsip dalam mode read-only

Jika kami ingin memeriksa atau mengekstrak konten arsip tar, kami dapat menggunakan salah satu mode berikut, untuk membukanya hanya baca:

Mode Arti
'R' BACA ONLY MODE - Jenis kompresi akan ditangani secara otomatis
'R:' Mode baca saja tanpa kompresi
'R: GZ' Mode baca saja - ritsleting Kompresi ditentukan secara eksplisit
'r: bz2' Mode baca saja - bzip Kompresi ditentukan secara eksplisit
'r: xz' Mode baca saja - LZMA Kompresi ditentukan secara eksplisit

Dalam sebagian besar kasus, di mana metode kompresi dapat dengan mudah dideteksi, mode yang disarankan untuk digunakan adalah 'R'.

Membuka arsip untuk menambahkan file

Jika kami ingin menambahkan file ke arsip yang ada, kami dapat menggunakan 'A' mode. Penting untuk memperhatikan bahwa dimungkinkan untuk menambahkan arsip hanya jika tidak dikompresi; Jika kami mencoba membuka arsip terkompresi dengan mode ini, a Nilaieror pengecualian akan dinaikkan. Jika kita merujuk arsip yang tidak ada, itu akan dibuat dengan cepat.

Membuka arsip untuk menulis

Jika kita ingin secara eksplisit membuat arsip baru dan membukanya untuk menulis, kita dapat menggunakan salah satu mode berikut:

Mode Arti
'W' Buka Arsip untuk Menulis - Gunakan Tidak Ada Kompresi
'W: GZ' Buka Arsip untuk Menulis - Gunakan Gzip kompresi
'W: bz' Buka Arsip untuk Menulis - Gunakan bzip2 kompresi
'W: xz' Buka Arsip untuk Menulis - Gunakan LZMA kompresi

Jika file arsip yang ada dibuka untuk ditulis, itu terpotong, jadi semua isinya dibuang. Untuk menghindari situasi seperti itu, kami mungkin ingin membuka arsip khusus, seperti yang dijelaskan di bagian selanjutnya.

Buat arsip hanya jika tidak ada

Ketika kami ingin memastikan file yang ada tidak ditimpa saat membuat arsip, kami harus membukanya khusus. Jika kita menggunakan 'X' mode dan file dengan nama yang sama dengan yang kami tentukan untuk arsip sudah ada, a FileExisserRor akan dibesarkan. Metode kompresi dapat ditentukan sebagai berikut:

Mode Arti
'X' Buat arsip tanpa kompresi jika tidak ada
'X: GZ' Buat arsip dengan Gzip kompresi hanya jika tidak ada
'x: bz2' Buat arsip dengan bzip2 kompresi hanya jika tidak ada
'x: xz' Buat arsip dengan LZMA kompresi hanya jika tidak ada

Bekerja dengan arsip

Ada dua kelas yang disediakan oleh Tarfile Modul yang digunakan untuk berinteraksi dengan arsip tar dan isinya, dan masing -masing: Tarfile Dan Tarinfo. Yang pertama digunakan untuk mewakili arsip tar secara keseluruhan dan dapat digunakan sebagai a Manajer Konteks dengan ular sanca dengan pernyataan, yang terakhir digunakan untuk mewakili anggota arsip, dan berisi berbagai informasi tentang hal itu. Sebagai langkah pertama, kami akan fokus pada beberapa metode yang paling sering digunakan dari Tarfile Kelas: Kami dapat menggunakannya untuk melakukan operasi umum di arsip tar.

Mengambil daftar anggota arsip

Untuk mengambil daftar anggota arsip kita dapat menggunakan GetMembers metode a Tarfile obyek. Metode ini mengembalikan daftar Tarinfo objek, satu untuk setiap anggota arsip. Berikut adalah contoh penggunaannya dengan arsip terkompresi dummy yang berisi dua file:

>>> dengan tarfile.Buka ('Arsip.ter.GZ ',' r ') sebagai arsip: ... arsip.getMembers () ... [, ] 
Menyalin

Seperti yang akan kita lihat nanti, kita dapat mengakses beberapa atribut file yang diarsipkan, sebagai kepemilikan dan waktu modifikasi, melalui yang sesuai Tarinfo sifat dan metode objek.

Menampilkan konten arsip tar

Jika semua yang ingin kami lakukan adalah menampilkan konten arsip tar, kami dapat membukanya dalam mode baca dan menggunakan daftar metode Tarfile kelas.

>>> dengan tarfile.Buka ('Arsip.ter.GZ ',' r ') sebagai arsip: ... arsip.daftar() ... ?RW-R-R-- EGDOC/EGDOC 0 2020-05-16 15:45:45 File1.txt ?RW-R-R-- EGDOC/EGDOC 0 2020-05-16 15:45:45 File2.txt 
Menyalin

Seperti yang Anda lihat daftar file yang terkandung dalam arsip ditampilkan sebagai output. Itu daftar Metode menerima parameter posisi, verbose yang BENAR secara default. Jika kita mengubah nilainya menjadi PALSU, Hanya nama file yang akan dilaporkan dalam output, tanpa informasi tambahan.

Metode ini juga menerima parameter bernama opsional, anggota. Jika digunakan, argumen yang disediakan harus merupakan bagian dari daftar Tarinfo objek yang dikembalikan oleh GetMembers metode. Hanya informasi tentang file yang ditentukan yang akan ditampilkan jika parameter ini digunakan dan nilai yang benar disediakan.

Mengekstraksi semua anggota dari arsip tar

Operasi lain yang sangat umum yang mungkin ingin kami lakukan pada arsip tar adalah mengekstrak semua isinya. Untuk melakukan operasi seperti itu, kita dapat menggunakan ekstrak semuametode yang sesuai Tarfile obyek. Inilah yang akan kami tulis:

>>> dengan tarfile.Buka ('Arsip.ter.GZ ',' r ') sebagai arsip: ... arsip.ekstrak semua() 
Menyalin

Parameter pertama yang diterima dengan metode ini jalur: Dulu menentukan di mana anggota arsip harus diekstraksi. Nilai defaultnya adalah '.', Jadi anggota diekstraksi di direktori kerja saat ini.

Parameter kedua, anggota, dapat digunakan untuk menentukan subset anggota untuk mengekstrak dari arsip, dan, seperti dalam kasus daftar metode, itu harus menjadi subset dari daftar yang dikembalikan oleh GetMembers metode.

Itu ekstrak semua Metode juga memiliki parameter bernama, numeric_owner. Dia PALSU secara default: jika kita mengubahnya menjadi BENAR, numerik uid Dan gid akan digunakan untuk mengatur kepemilikan file yang diekstraksi alih -alih nama pengguna dan grup.

Hanya mengekstraksi satu anggota dari arsip

Bagaimana jika kita hanya ingin mengekstrak satu file dari arsip? Dalam hal ini kami ingin menggunakan ekstrak metode dan referensi file yang harus diekstraksi olehnya nama (atau sebagai a Tarfile obyek). Misalnya, hanya untuk mengekstraksi file1.txt File dari Tarball, kami akan menjalankan:

>>> dengan tarfile.Buka ('Arsip.ter.GZ ',' r ') sebagai arsip: ... arsip.ekstrak ('file1.txt') 
Menyalin

Mudah, bukan? File diekstraksi pada direktori kerja saat ini secara default, tetapi posisi yang berbeda dapat ditentukan menggunakan parameter kedua yang diterima dengan metode: jalur.

Biasanya atribut yang dimiliki file di dalam arsip diatur ketika diekstraksi pada sistem file; Untuk menghindari perilaku ini, kita dapat mengatur parameter ketiga fungsi, set_attrs, ke PALSU.

Metode ini juga menerima numeric_owner Parameter: Penggunaannya sama dengan yang kita lihat dalam konteks ekstrak semua metode.

Mengekstraksi anggota arsip sebagai objek seperti file

Kami melihat bagaimana, dengan menggunakan ekstrak semua Dan ekstrak metode kami dapat mengekstrak satu atau beberapa anggota arsip tar ke sistem file. Itu Tarfile Modul menyediakan metode ekstraksi lain: Extractfile. Ketika metode ini digunakan, file yang ditentukan tidak diekstraksi ke sistem file; Sebaliknya, objek seperti file-read-only yang mewakili itu dikembalikan:

>>> dengan tarfile.Buka ('Arsip.ter.GZ ',' r ') sebagai arsip: ... fileobj = arsip.ExtractFile ('file1.txt') ... fileobj.dapat ditulis() ... fileobj.membaca() ... False b'hello \ nworld \ n ' 
Menyalin

Menambahkan file ke arsip

Sampai sekarang kami melihat cara mendapatkan informasi tentang arsip dan anggotanya, dan berbagai metode yang dapat kami gunakan untuk mengekstrak isinya; sekarang saatnya untuk melihat bagaimana kita dapat menambahkan anggota baru.

Cara termudah yang dapat kita gunakan untuk menambahkan file ke arsip adalah dengan menggunakan menambahkan metode. Kami merujuk file yang akan dimasukkan dalam arsip oleh nama, yang merupakan parameter pertama yang diterima dengan metode ini. File akan diarsipkan dengan nama aslinya, kecuali kami menentukan yang alternatif menggunakan parameter posisi kedua: Arcname. Misalkan kita ingin menambahkan file1.txt ke arsip baru, tetapi kami ingin menyimpannya sebagai archived_file1.txt; Kami akan menulis:

>>> dengan tarfile.buka ('new_archive.ter.GZ ',' W ') sebagai arsip: ... arsip.tambahkan ('file1.txt ',' archived_file1.txt') ... arsip.daftar() ... -RW-R-R-- EGDOC/EGDOC 12 2020-05-16 17:49:44 Archived_File1.txt 
Menyalin

Dalam contoh di atas, kami membuat arsip baru yang tidak terkompresi menggunakan 'W' mode dan menambahkan file1.txt sebagai archive_file1.txt, seperti yang Anda lihat dengan output daftar().

Direktori dapat diarsipkan dengan cara yang sama: secara default ditambahkan secara rekursif, jadi bersama dengan kontennya. Perilaku ini dapat diubah dengan mengatur parameter posisi ketiga yang diterima oleh menambahkan metode, rekursif, ke PALSU.

Bagaimana jika kita ingin menerapkan filter, sehingga hanya file yang ditentukan yang termasuk dalam arsip? Untuk tujuan ini kita dapat menggunakan opsional Saring Parameter bernama. Nilai yang diteruskan ke parameter ini harus merupakan fungsi yang mengambil a Tarinfo objek sebagai argumen dan mengembalikan objek tersebut jika harus dimasukkan dalam arsip atau Tidak ada Jika harus dikecualikan. Mari kita lihat contohnya. Misalkan kami memiliki tiga file di direktori kerja kami saat ini: file1.txt, file2.txt Dan file1.md. Kami hanya ingin menambahkan file dengan .txt ekstensi ke arsip; Inilah yang bisa kami tulis:

>>> Impor OS >>> impor tarfile >>> dengan tarfile.buka ('new_archive.ter.GZ ',' W ') sebagai arsip: ... untuk saya di OS.listdir (): ... arsip.tambahkan (i, filter = lambda x: x jika x.nama.berakhir dengan('.txt ') lain tidak ada) ... arsip.daftar() ... -RW-R-R-- EGDOC/EGDOC 0 2020-05-16 18:26:20 File2.txt -rw-r-r-- egdoc/egdoc 0 2020-05-16 18:22:13 File1.txt 
Menyalin

Dalam contoh di atas kami menggunakan os.ListDir Metode untuk mendapatkan daftar file yang terkandung dalam direktori kerja saat ini. Iterasi atas daftar tersebut, kami menggunakan menambahkan metode untuk menambahkan setiap file ke arsip. Kami melewati suatu fungsi sebagai argumen dari Saring parameter, dalam hal ini yang anonim, a Lambda. Fungsi mengambil objek tarfile sebagai argumen (x) dan mengembalikannya jika namanya (namanya adalah salah satu properti dari Tarinfo objek) berakhir dengan “.txt". Jika bukan masalahnya, fungsi kembali Tidak ada Jadi file tidak diarsipkan.

Objek Tarinfo

Kami sudah belajar bahwa Tarinfo Objek mewakili anggota arsip tar: ia menyimpan atribut file yang direferensikan dan menyediakan beberapa metode yang dapat membantu kami mengidentifikasi jenis file itu sendiri. Itu Tarinfo Objek tidak berisi data file yang sebenarnya. Beberapa atribut dari Tarinfo Objek adalah:

  • nama (nama file)
  • Ukuran (ukuran file)
  • mTime (waktu modifikasi file)
  • UID (ID pengguna pemilik file)
  • GID (ID grup file)
  • uname (nama pengguna pemilik file)
  • Gname (nama grup file)

Objek ini juga memiliki beberapa metode yang sangat berguna, berikut adalah beberapa di antaranya:

  • isFile () - returns true jika file tersebut adalah file biasa, false sebaliknya
  • isDir () - Mengembalikan true jika file tersebut adalah direktori, false sebaliknya
  • issym () - returns true jika file tersebut adalah tautan simbolik, false sebaliknya
  • isblk () - mengembalikan true jika file tersebut adalah perangkat blok, false sebaliknya

Kesimpulan

Dalam tutorial ini kami mempelajari penggunaan dasar dari Tarfile Modul python, dan kami melihat bagaimana kami dapat menggunakannya untuk bekerja dengan arsip tar. Kami melihat berbagai mode operasi, apa itu Tarfile Dan Tarinfo Kelas mewakili, dan beberapa metode yang paling banyak digunakan untuk mencantumkan konten arsip, untuk menambahkan file baru atau mengekstraknya. Untuk pengetahuan yang lebih mendalam tentang Tarfile Modul Harap lihat dokumentasi resmi modul

Tutorial Linux Terkait:

  • Pengantar Otomatisasi Linux, Alat dan Teknik
  • Hal -hal yang harus diinstal pada ubuntu 20.04
  • Menguasai loop skrip bash
  • Hal -hal yang harus dilakukan setelah menginstal ubuntu 20.04 FOSSA FOSSA Linux
  • Loop bersarang dalam skrip bash
  • Ubuntu 22.04 Sistem Pencadangan dan Pulihkan
  • Mint 20: Lebih baik dari Ubuntu dan Microsoft Windows?
  • Cara membuat cadangan tambahan dan diferensial dengan tar
  • Cara membuat dan mengekstrak arsip cpio pada contoh linux
  • Pengantar Cadangan Borg