Cara membuat dan memanipulasi arkib tar menggunakan python

Cara membuat dan memanipulasi arkib tar menggunakan python

Pada Linux dan sistem operasi seperti Unix yang lain, TAR tidak diragukan lagi salah satu utiliti pengarkiban yang paling banyak digunakan; Ini membolehkan kita membuat arkib, sering disebut "tarballs", kita boleh menggunakan untuk pengagihan kod sumber atau tujuan sandaran. Dalam tutorial ini kita akan melihat cara membaca, membuat dan mengubah suai arkib tar dengan Python, menggunakan tarfile modul.

Dalam tutorial ini anda akan belajar:

  • Mod di mana arkib tar dapat dibuka menggunakan modul tarfile
  • Apakah kelas Tarinfo dan Tarfile dan apa yang mereka wakili
  • Cara menyenaraikan kandungan arkib tar
  • Cara mengekstrak kandungan arkib tar
  • Cara menambah fail ke arkib tar


Keperluan perisian dan konvensyen yang digunakan

Keperluan Perisian dan Konvensyen Talian Perintah Linux
Kategori Keperluan, konvensyen atau versi perisian yang digunakan
Sistem Pengedaran-bebas
Perisian Python3
Yang lain Pengetahuan asas Python3 dan pengaturcaraan berorientasikan objek
Konvensyen # - Memerlukan arahan Linux yang diberikan untuk dilaksanakan dengan keistimewaan akar sama ada secara langsung sebagai pengguna root atau dengan menggunakan sudo perintah
$ - Memerlukan arahan Linux yang diberikan sebagai pengguna yang tidak layak

Penggunaan asas

The tarfile Modul dimasukkan ke dalam Perpustakaan Standard Python, jadi kami tidak perlu memasangnya secara berasingan; Untuk menggunakannya, kita hanya perlu "mengimport". Cara yang disyorkan untuk mengakses tarball menggunakan modul ini adalah oleh buka fungsi; Dalam penggunaan yang paling asas, kita mesti menyediakan, sebagai hujah pertama dan kedua:

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

"Mod" yang digunakan untuk membuka arkib tar bergantung pada tindakan yang ingin kita lakukan dan pada jenis mampatan (jika ada) yang digunakan. Mari lihat mereka bersama.

Membuka arkib dalam mod baca sahaja

Jika kita ingin memeriksa atau mengekstrak kandungan arkib tar, kita boleh menggunakan salah satu mod berikut, untuk membukanya sahaja:

Mod Makna
'r' Baca sahaja mod - jenis mampatan akan dikendalikan secara automatik
'r:' Mod baca sahaja tanpa mampatan
'r: gz' Mod baca sahaja - zip Mampatan secara eksplisit ditentukan
'r: bz2' Mod baca sahaja - bzip Mampatan secara eksplisit ditentukan
'r: xz' Mod baca sahaja - lzma Mampatan secara eksplisit ditentukan

Dalam kebanyakan kes, di mana kaedah mampatan dapat dikesan dengan mudah, mod yang disyorkan untuk digunakan adalah 'r'.

Membuka arkib untuk menambah fail

Sekiranya kita mahu menambah fail ke arkib yang ada, kita boleh menggunakannya 'a' mod. Adalah penting untuk melihat bahawa ia mungkin untuk ditambahkan ke arkib hanya jika ia tidak dimampatkan; Sekiranya kita cuba membuka arkib termampat dengan mod ini, a ValueError Pengecualian akan dibangkitkan. Sekiranya kita merujuk arkib yang tidak sedia ada, ia akan dibuat dengan cepat.

Membuka Arkib untuk Menulis

Jika kita ingin membuat arkib baru dan membukanya untuk menulis, kita boleh menggunakan salah satu mod berikut:

Mod Makna
'W' Buka arkib untuk menulis - Gunakan tiada pemampatan
'w: gz' Buka Arkib untuk Menulis - Gunakan gzip mampatan
'w: bz' Buka Arkib untuk Menulis - Gunakan BZIP2 mampatan
'W: xz' Buka Arkib untuk Menulis - Gunakan lzma mampatan

Sekiranya fail arkib sedia ada dibuka untuk menulis, ia dipotong, jadi semua kandungannya dibuang. Untuk mengelakkan situasi seperti itu, kami mungkin mahu membuka arkib semata -mata, seperti yang diterangkan di bahagian seterusnya.

Buat arkib hanya jika tidak wujud

Apabila kita ingin memastikan fail yang ada tidak ditindas ketika membuat arkib, kita mesti membukanya semata -mata. Sekiranya kita menggunakan 'X' mod dan fail dengan nama yang sama yang kami tentukan untuk arkib sudah ada, a FileExistsError akan dibangkitkan. Kaedah mampatan boleh ditentukan seperti berikut:

Mod Makna
'X' Buat arkib tanpa mampatan jika tidak wujud
'x: gz' Buat arkib dengan gzip mampatan hanya jika ia tidak wujud
'x: bz2' Buat arkib dengan BZIP2 mampatan hanya jika ia tidak wujud
'x: xz' Buat arkib dengan lzma mampatan hanya jika ia tidak wujud

Bekerja dengan arkib

Terdapat dua kelas yang disediakan oleh tarfile modul yang digunakan untuk berinteraksi dengan arkib tar dan kandungannya, dan masing -masing: Tarfile dan Tarinfo. Yang pertama digunakan untuk mewakili arkib tar secara keseluruhan dan boleh digunakan sebagai Pengurus Konteks dengan python dengan pernyataan, yang terakhir digunakan untuk mewakili ahli arkib, dan mengandungi pelbagai maklumat mengenainya. Sebagai langkah pertama, kami akan memberi tumpuan kepada beberapa kaedah yang paling sering digunakan Tarfile Kelas: Kita boleh menggunakannya untuk melaksanakan operasi biasa pada arkib tar.

Mendapatkan senarai ahli arkib

Untuk mendapatkan senarai ahli arkib kita boleh menggunakan getmembers kaedah a Tarfile objek. Kaedah ini mengembalikan senarai Tarinfo objek, satu untuk setiap ahli arkib. Berikut adalah contoh penggunaannya dengan arkib mampat dummy yang mengandungi dua fail:

>>> dengan tarfile.Buka ('Arkib.tar.gz ',' r ') sebagai arkib: ... arkib.getMembers () ... [, ] 
Salinan

Seperti yang akan kita lihat kemudian, kita dapat mengakses beberapa sifat fail yang diarkibkan, sebagai pemilikan dan masa pengubahsuaiannya, melalui yang sepadan Tarinfo sifat objek dan kaedah.

Memaparkan kandungan arkib tar

Sekiranya semua yang kita mahu lakukan ialah memaparkan kandungan arkib tar, kita boleh membukanya dalam mod baca dan menggunakan senarai kaedah Tarfile kelas.

>>> dengan tarfile.Buka ('Arkib.tar.gz ',' r ') sebagai arkib: ... arkib.senarai () ... ?RW-R-R-- EGDOC/EGDOC 0 2020-05-16 15:45:45 Fail1.txt ?RW-R-R-- EGDOC/EGDOC 0 2020-05-16 15:45:45 File2.txt 
Salinan

Seperti yang anda dapat lihat senarai fail yang terkandung dalam arkib dipaparkan sebagai output. The senarai kaedah menerima parameter kedudukan, verbose iaitu Benar Secara lalai. Sekiranya kita menukar nilainya Salah, Hanya nama fail yang akan dilaporkan dalam output, tanpa maklumat tambahan.

Kaedah ini juga menerima parameter bernama pilihan, ahli. Sekiranya digunakan, hujah yang disediakan mestilah subset senarai Tarinfo objek yang dikembalikan oleh getmembers kaedah. Hanya maklumat mengenai fail yang ditentukan akan dipaparkan jika parameter ini digunakan dan nilai yang betul disediakan.

Mengekstrak semua ahli dari arkib TAR

Satu lagi operasi yang sangat biasa yang mungkin kita mahu lakukan pada arkib tar adalah untuk mengekstrak semua kandungannya. Untuk melaksanakan operasi sedemikian, kita boleh menggunakan ekstrak semuakaedah yang sepadan Tarfile objek. Inilah yang akan kita tulis:

>>> dengan tarfile.Buka ('Arkib.tar.gz ',' r ') sebagai arkib: ... arkib.ekstrak semua() 
Salinan

Parameter pertama yang diterima oleh kaedah adalah jalan: digunakan untuk menentukan di mana ahli -ahli arkib harus diekstrak. Nilai lalai adalah '.', Oleh itu, ahli -ahli diekstrak dalam direktori kerja semasa.

Parameter kedua, ahli, boleh digunakan untuk menentukan subset ahli untuk mengekstrak dari arkib, dan, seperti dalam kes senarai kaedah, ia mestilah subset senarai yang dikembalikan oleh getmembers kaedah.

The ekstrak semua kaedah juga mempunyai parameter bernama, Numeric_owner. Ia adalah Salah Secara lalai: Sekiranya kita mengubahnya menjadi Benar, angka uid dan gid akan digunakan untuk menetapkan pemilikan fail yang diekstrak dan bukannya nama pengguna dan kumpulan.

Mengekstrak hanya satu ahli dari arkib

Bagaimana jika kita mahu mengekstrak hanya satu fail dari arkib? Dalam hal ini kita mahu menggunakan ekstrak kaedah dan merujuk fail yang harus diekstrak olehnya nama (atau sebagai Tarfile objek). Contohnya, untuk mengekstrak hanya Fail1.txt Fail dari tarball, kami akan lari:

>>> dengan tarfile.Buka ('Arkib.tar.gz ',' r ') sebagai arkib: ... arkib.Ekstrak ('File1.txt ') 
Salinan

Mudah, bukan? Fail ini diekstrak pada direktori kerja semasa secara lalai, tetapi kedudukan yang berbeza boleh ditentukan menggunakan parameter kedua yang diterima oleh kaedah: jalan.

Biasanya atribut fail yang ada di dalam arkib ditetapkan apabila ia diekstrak pada sistem fail; Untuk mengelakkan tingkah laku ini, kita dapat menetapkan parameter ketiga fungsi, set_attrs, ke Salah.

Kaedah ini juga menerima Numeric_owner parameter: penggunaan yang sama yang kita lihat dalam konteks ekstrak semua kaedah.

Mengekstrak ahli arkib sebagai objek seperti fail

Kami melihat bagaimana, dengan menggunakan ekstrak semua dan ekstrak Kaedah yang boleh kita ambil satu atau berbilang ahli arkib tar ke sistem fail. The tarfile Modul menyediakan kaedah pengekstrakan lain: ExtractFile. Apabila kaedah ini digunakan, fail yang ditentukan tidak diekstrak ke sistem fail; Sebaliknya, objek seperti fail baca yang mewakili ia dikembalikan:

>>> dengan tarfile.Buka ('Arkib.tar.gz ',' r ') sebagai arkib: ... FileObj = Arkib.ExtractFile ('File1.txt ') ... FileObj.lancar () ... FileObj.Baca () ... Palsu b'hello \ nworld \ n ' 
Salinan

Menambah fail ke arkib

Sehingga kini kita melihat bagaimana untuk mendapatkan maklumat mengenai arkib dan ahli -ahlinya, dan kaedah yang berbeza yang boleh kita gunakan untuk mengekstrak kandungannya; Sekarang sudah tiba masanya untuk melihat bagaimana kita dapat menambahkan ahli baru.

Cara paling mudah yang boleh kita gunakan untuk menambah fail ke arkib adalah dengan menggunakan Tambah kaedah. Kami merujuk fail yang akan dimasukkan ke dalam arkib oleh nama, yang merupakan parameter pertama yang diterima oleh kaedah. Fail ini akan diarkibkan dengan nama asalnya, melainkan jika kita menentukan alternatif yang menggunakan parameter kedudukan kedua: arcname. Katakan kita mahu menambah Fail1.txt ke arkib baru, tetapi kami mahu menyimpannya sebagai archived_file1.txt; Kami akan menulis:

>>> dengan tarfile.buka ('new_archive.tar.gz ',' w ') sebagai arkib: ... arkib.tambah ('File1.txt ',' archived_file1.txt ') ... arkib.senarai () ... -RW-R-R-- EGDOC/EGDOC 12 2020-05-16 17:49:44 Archived_FILE1.txt 
Salinan

Dalam contoh di atas, kami membuat arkib baru yang tidak dikompresi menggunakan 'W' mod dan menambah Fail1.txt sebagai archive_file1.txt, seperti yang anda lihat dengan output senarai ().

Direktori boleh diarkibkan dengan cara yang sama: Secara lalai ditambah secara rekursif, jadi bersama -sama dengan kandungan mereka. Tingkah laku ini dapat diubah dengan menetapkan parameter kedudukan ketiga yang diterima oleh Tambah kaedah, rekursif, ke Salah.

Bagaimana jika kita mahu memohon penapis, jadi hanya fail yang ditentukan dimasukkan ke dalam arkib? Untuk tujuan ini kita boleh menggunakan pilihan penapis Parameter yang dinamakan. Nilai yang diserahkan kepada parameter ini mestilah fungsi yang memerlukan Tarinfo objek sebagai hujah dan pulangan kata objek jika ia mesti dimasukkan ke dalam arkib atau Tiada Sekiranya ia mesti dikecualikan. Mari lihat contoh. Katakan kami mempunyai tiga fail dalam direktori kerja semasa kami: Fail1.txt, File2.txt dan Fail1.md. Kami mahu menambah fail dengan .txt lanjutan ke arkib; Inilah yang boleh kita tulis:

>>> import os >>> import tarfile >>> dengan tarfile.buka ('new_archive.tar.gz ',' w ') sebagai arkib: ... untuk saya di OS.listdir (): ... arkib.tambah (i, penapis = lambda x: x jika x.nama.EndSwith ('.txt ') lain tidak ada) ... arkib.senarai () ... -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 
Salinan

Dalam contoh di atas kami menggunakan OS.listdir kaedah untuk mendapatkan senarai fail yang terkandung dalam direktori kerja semasa. Melangkah ke atas senarai tersebut, kami menggunakan Tambah kaedah untuk menambah setiap fail ke arkib. Kami meluluskan fungsi sebagai hujah penapis parameter, dalam kes ini tanpa nama, a Lambda. Fungsi ini mengambil objek tarfile sebagai argumen (x) dan mengembalikannya jika namanya (namanya adalah salah satu sifat dari Tarinfo objek) berakhir dengan ".txt ”. Sekiranya tidak berlaku, fungsi itu kembali Tiada Jadi fail tidak diarkibkan.

Objek Tarinfo

Kami sudah mengetahui bahawa Tarinfo Objek mewakili ahli arkib tar: ia menyimpan atribut fail yang dirujuk dan menyediakan beberapa kaedah yang dapat membantu kita mengenal pasti jenis fail itu sendiri. The Tarinfo objek tidak mengandungi data fail sebenar. Beberapa atribut Tarinfo objek adalah:

  • Nama (nama fail)
  • saiz (saiz fail)
  • mtime (masa pengubahsuaian fail)
  • uid (ID pengguna pemilik fail)
  • GID (id kumpulan fail)
  • uname (nama pengguna pemilik fail)
  • Gname (nama kumpulan fail)

Objek ini juga mempunyai beberapa kaedah yang sangat berguna, berikut adalah sebahagian daripada mereka:

  • isfile () - pulangan benar jika fail adalah fail biasa, palsu sebaliknya
  • isdir () - pulangan benar jika fail itu direktori, palsu sebaliknya
  • issym () - pulangan benar jika fail adalah pautan simbolik, palsu sebaliknya
  • isblk () - pulangan benar jika fail adalah peranti blok, palsu sebaliknya

Kesimpulan

Dalam tutorial ini, kami mempelajari penggunaan asas tarfile Modul python, dan kita melihat bagaimana kita boleh menggunakannya untuk bekerja dengan arkib tar. Kami melihat pelbagai mod operasi, apa yang Tarfile dan Tarinfo kelas mewakili, dan beberapa kaedah yang paling banyak digunakan untuk menyenaraikan kandungan arkib, untuk menambah fail baru atau untuk mengeluarkannya. Untuk pengetahuan yang lebih mendalam mengenai tarfile modul sila lihat dokumentasi rasmi modul

Tutorial Linux Berkaitan:

  • Pengenalan kepada Automasi, Alat dan Teknik Linux
  • Perkara yang hendak dipasang di Ubuntu 20.04
  • Menguasai Gelung Skrip Bash
  • Perkara yang perlu dilakukan setelah memasang ubuntu 20.04 Focal Fossa Linux
  • Gelung bersarang dalam skrip bash
  • Ubuntu 22.04 Sistem sandaran dan pulihkan
  • Mint 20: Lebih baik daripada Ubuntu dan Microsoft Windows?
  • Cara membuat sandaran tambahan dan pembezaan dengan tar
  • Cara membuat dan mengekstrak arkib CPIO pada contoh Linux
  • Pengenalan kepada sandaran Borg