Cara membuat dan memanipulasi arsip tar menggunakan python
- 3317
- 311
- Dominick Barton
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
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 semua
metode 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