zipfile για συμπίεση και αποσυμπίεση αρχείων ZIP σε Python

Επιχείρηση

Η ενότητα zipfile της τυπικής βιβλιοθήκης της Python μπορεί να χρησιμοποιηθεί για τη συμπίεση αρχείων σε ZIP και την αποσυμπίεση αρχείων ZIP. Περιλαμβάνεται στην τυπική βιβλιοθήκη, οπότε δεν απαιτείται επιπλέον εγκατάσταση.

Εξηγούνται τα ακόλουθα περιεχόμενα.

  • Συμπίεση πολλαπλών αρχείων σε ένα αρχείο ZIP
  • Προσθήκη νέου αρχείου σε υπάρχον αρχείο ZIP
  • Συμπίεση ενός καταλόγου (φακέλου) σε αρχείο ZIP
  • Συμπιεσμένο σε αρχείο ZIP με κωδικό πρόσβασης
  • Ελέγξτε τα περιεχόμενα του αρχείου ZIP.
  • Εξαγάγετε (αποσυμπιέστε) ολόκληρο το περιεχόμενο του αρχείου ZIP.
  • Επιλέξτε τα περιεχόμενα του αρχείου ZIP και αποσυμπιέστε το.

Συμπίεση πολλαπλών αρχείων σε ένα αρχείο ZIP

Δημιουργήστε ένα αντικείμενο ZipFile και χρησιμοποιήστε τη μέθοδο write() για να προσθέσετε τα αρχεία που θέλετε να συμπιέσετε.

Για να δημιουργήσετε ένα νέο αρχείο ZIP, καθορίστε τη διαδρομή του προς δημιουργία αρχείου ZIP ως το πρώτο όρισμα του κατασκευαστή του αντικειμένου ZipFile και το δεύτερο όρισμα ως εξής'w'

Επιπλέον, η μέθοδος συμπίεσης μπορεί να καθοριστεί ως τρίτο όρισμα.

  • zipfile.ZIP_STORED:Απλά συνδυάζει πολλαπλά αρχεία χωρίς συμπίεση (προεπιλογή)
  • zipfile.ZIP_DEFLATED:Κανονική συμπίεση ZIP (απαιτείται η ενότητα zlib)
  • zipfile.ZIP_BZIP2:Συμπίεση BZIP2 (απαιτείται ενότητα bz2)
  • zipfile.ZIP_LZMA:Συμπίεση LZMA (απαιτείται ενότητα lzma)

Τα BZIP2 και LZMA έχουν υψηλότερο λόγο συμπίεσης (μπορούν να συμπιεστούν σε μικρότερο μέγεθος), αλλά ο χρόνος που απαιτείται για τη συμπίεση είναι μεγαλύτερος.

Στη μέθοδο write(), το αρχείο με το πρώτο όρισμα filename γράφεται σε ένα αρχείο ZIP με το δεύτερο όρισμα arcname. Εάν το arcname παραλείπεται, το filename χρησιμοποιείται ως έχει. Το arcname μπορεί επίσης να καθορίσει μια δομή καταλόγου.

Το αντικείμενο ZipFile πρέπει να κλείσει με τη μέθοδο close(), αλλά αν χρησιμοποιήσετε τη δήλωση with, θα κλείσει αυτόματα όταν ολοκληρωθεί το μπλοκ.

import zipfile

with zipfile.ZipFile('data/temp/new_comp.zip', 'w', compression=zipfile.ZIP_DEFLATED) as new_zip:
    new_zip.write('data/temp/test1.txt', arcname='test1.txt')
    new_zip.write('data/temp/test2.txt', arcname='zipdir/test2.txt')
    new_zip.write('data/temp/test3.txt', arcname='zipdir/sub_dir/test3.txt')

Καθορίζοντας το όρισμα compress_type της μεθόδου write(), είναι επίσης δυνατή η επιλογή της μεθόδου συμπίεσης για κάθε αρχείο.

with zipfile.ZipFile('data/temp/new_comp_single.zip', 'w') as new_zip:
    new_zip.write('data/temp/test1.txt', arcname='test1.txt', compress_type=zipfile.ZIP_DEFLATED)
    new_zip.write('data/temp/test2.txt', arcname='zipdir/test2.txt')
    new_zip.write('data/temp/test3.txt', arcname='zipdir/sub_dir/test3.txt')

Προσθήκη νέου αρχείου σε υπάρχον αρχείο ZIP

Για να προσθέσετε ένα νέο αρχείο σε ένα υπάρχον αρχείο zip, ορίστε το πρώτο όρισμα του κατασκευαστή στη διαδρομή του υπάρχοντος αρχείου zip κατά τη δημιουργία του αντικειμένου ZipFile. Επίσης, ορίστε τη λειτουργία του δεύτερου ορίσματος ως εξής.'a'

Στη συνέχεια, όπως στο παραπάνω παράδειγμα, απλά προσθέστε το αρχείο χρησιμοποιώντας τη μέθοδο write().

with zipfile.ZipFile('data/temp/new_comp.zip', 'a') as existing_zip:
    existing_zip.write('data/temp/test4.txt', arcname='test4.txt')

Συμπίεση ενός καταλόγου (φακέλου) σε αρχείο ZIP

Αν θέλετε να συμπιέσετε έναν ολόκληρο κατάλογο (φάκελο) σε ένα ενιαίο αρχείο ZIP, μπορείτε να χρησιμοποιήσετε την os.scandir() ή την os.listdir() για να δημιουργήσετε μια λίστα αρχείων, αλλά είναι ευκολότερο να χρησιμοποιήσετε την make_archive() στην ενότητα shutil.

Δείτε το ακόλουθο άρθρο.

Συμπιεσμένο σε αρχείο ZIP με κωδικό πρόσβασης

Η ενότητα zipfile δεν σας επιτρέπει να δημιουργήσετε ZIP που προστατεύονται με κωδικό πρόσβασης. Αν θέλετε να συμπιέσετε ένα αρχείο σε ένα αρχείο zip που προστατεύεται με κωδικό πρόσβασης, χρησιμοποιήστε τη βιβλιοθήκη τρίτου μέρους pyminizip.

Σημειώστε ότι η αποσυμπίεση των ZIP που προστατεύονται με κωδικό πρόσβασης μπορεί να γίνει με την ενότητα zipfile (δείτε παρακάτω).

Ελέγξτε τα περιεχόμενα του αρχείου ZIP.

Μπορείτε να ελέγξετε τα περιεχόμενα ενός υπάρχοντος αρχείου ZIP.

Δημιουργήστε ένα αντικείμενο ZipFile θέτοντας το πρώτο όρισμα file στον κατασκευαστή στη διαδρομή του υπάρχοντος αρχείου zip και το δεύτερο όρισμα mode σε 'r'. Το όρισμα mode μπορεί να παραλειφθεί αφού η προεπιλογή είναι 'r'.

Μπορείτε να χρησιμοποιήσετε τη μέθοδο namelist() του αντικειμένου ZipFile για να λάβετε μια λίστα αρχειοθετημένων αρχείων.

with zipfile.ZipFile('data/temp/new_comp.zip') as existing_zip:
    print(existing_zip.namelist())
# ['test1.txt', 'zipdir/test2.txt', 'zipdir/sub_dir/test3.txt', 'test4.txt']

Εξαγάγετε (αποσυμπιέστε) ολόκληρο το περιεχόμενο του αρχείου ZIP.

Για να αποσυμπιέσετε τα περιεχόμενα ενός αρχείου ZIP, δημιουργήστε ένα αντικείμενο ZipFile με το πρώτο όρισμα file στον κατασκευαστή ως τη διαδρομή του υπάρχοντος αρχείου ZIP και το δεύτερο όρισμα mode ως 'r', όπως στο παραπάνω παράδειγμα. Το όρισμα mode μπορεί να παραλειφθεί, καθώς είναι προεπιλεγμένο σε 'r'.

Η μέθοδος extractall() του αντικειμένου ZipFile εξάγει (αποσυμπιέζει) ολόκληρο το περιεχόμενο του αρχείου ZIP. Το πρώτο όρισμα, path, καθορίζει τη διαδρομή του καταλόγου στον οποίο θα γίνει η εξαγωγή. Εάν παραλειφθεί, τα αρχεία θα εξαχθούν στον τρέχοντα κατάλογο.

with zipfile.ZipFile('data/temp/new_comp.zip') as existing_zip:
    existing_zip.extractall('data/temp/ext')

Ένα αρχείο ZIP με κωδικό πρόσβασης μπορεί να εξαχθεί καθορίζοντας τον κωδικό πρόσβασης ως όρισμα pwd της μεθόδου extractall().

with zipfile.ZipFile('data/temp/new_comp_with_pass.zip') as pass_zip:
    pass_zip.extractall('data/temp/ext_pass', pwd='password')

Επιλέξτε τα περιεχόμενα του αρχείου ZIP και αποσυμπιέστε το.

Αν θέλετε να αποσυμπιέσετε και να εξαγάγετε μόνο ορισμένα αρχεία, χρησιμοποιήστε τη μέθοδο extract().

Το πρώτο όρισμα της μεθόδου extract() είναι το όνομα του αρχείου προς εξαγωγή και το δεύτερο όρισμα path είναι η διαδρομή του καταλόγου στον οποίο θα γίνει η εξαγωγή. Εάν το όρισμα path παραλειφθεί, το αρχείο θα εξαχθεί στον τρέχοντα κατάλογο. Το όνομα του αρχείου προς εξαγωγή θα πρέπει να περιλαμβάνει τη διαδρομή προς τον κατάλογο στο αρχείο ZIP, εάν είναι αποθηκευμένο εκεί.

with zipfile.ZipFile('data/temp/new_comp.zip') as existing_zip:
    existing_zip.extract('test1.txt', 'data/temp/ext2')

Όπως και η μέθοδος extractall(), η μέθοδος extract() σας επιτρέπει επίσης να καθορίσετε έναν κωδικό πρόσβασης ως όρισμα pwd.

with zipfile.ZipFile('data/temp/new_comp_with_pass.zip') as pass_zip:
    pass_zip.extract('test1.txt', 'data/temp/ext_pass2', pwd='password')