Comprimarea și extragerea fișierelor în Python

Dacă ați folosit calculatoare de ceva timp, ați întâmpinat probabil fișiere cu .zip extensie. Sunt fișiere speciale care pot conține conținutul comprimat al multor alte fișiere, foldere și subfoldere. Acest lucru le face destul de utile pentru transferul de fișiere pe internet. Știați că puteți utiliza Python pentru a comprima sau a extrage fișiere?

Acest tutorial vă va învăța cum să utilizați fișier Zip modul în Python, pentru a extrage sau comprima fișiere individuale sau multiple simultan.

Comprimarea fișierelor individuale

Acesta este ușor și necesită foarte puțin cod. Începem prin importul fișier Zip modul și apoi deschideți obiectul ZipFile în modul de scriere specificând al doilea parametru ca "w". Primul parametru este calea către fișierul în sine. Iată codul de care aveți nevoie:

import zipfile jungle_zip = zipfile.ZipFile ('C: \\ Povestiri \\ Fantasy \\ jungle.zip', 'w') jungle_zip.write ('C: \\ Stories \\ Fantasy \\ jungle.pdf', compress_type = zipfile.ZIP_DEFLATED) jungle_zip.close ()

Rețineți că voi specifica calea în toate fragmentele de cod într-un format de stil Windows; va trebui să faceți schimbările corespunzătoare dacă sunteți pe Linux sau Mac.

Puteți specifica diferite metode de comprimare pentru a comprima fișiere. Metodele mai noi bzip2 și LZMA au fost adăugate în Python versiunea 3.3 și există și alte instrumente care nu acceptă aceste două metode de compresie. Din acest motiv, este sigur să folosiți doar dezumflat metodă. Ar trebui să încercați în continuare aceste metode pentru a vedea diferența în dimensiunea fișierului comprimat.

Comprimarea mai multor fișiere

Acest lucru este puțin complex deoarece trebuie să repetați toate fișierele. Codul de mai jos ar trebui să comprime toate fișierele cu extensia pdf într-un dosar dat:

importul importului zipfile fantasy_zip = zipfile.ZipFile ('C: \\ Stories \\ Fantasy \\ archive.zip', 'w') pentru dosare, subfoldere, fișiere în os.walk ('C: \\ Stories \\ Fantasy '): pentru fișierul în fișiere: dacă file.endswith (' .pdf '): fantasy_zip.write (os.path.join (dosar, fișier), os.path.relpath (os.path.join (dosar, fișier) , 'C: \\ Povestiri \' Fantasy '), compress_type = zipfile.ZIP_DEFLATED) fantasy_zip.close () 

De data aceasta, am importat os modul și a folosit-o mers pe jos() pentru a trece peste toate fișierele și subfolderele din dosarul nostru original. Eu comprim doar fișierele pdf din director. De asemenea, puteți crea fișiere arhivate diferite pentru fiecare format utilizând dacă declaraţii.

Dacă nu doriți să păstrați structura directorului, puteți pune împreună toate fișierele utilizând următoarea linie:

fantasy_zip.write (os.path.join (dosar, fișier), fișier, compress_type = zipfile.ZIP_DEFLATED)

scrie() metoda acceptă trei parametri. Primul parametru este numele fișierului nostru pe care dorim să îl comprimăm. Al doilea parametru este opțional și vă permite să specificați un alt nume de fișier pentru fișierul comprimat. Dacă nu este specificat nimic, se utilizează numele original.

Extragerea tuturor fișierelor

Puteți utiliza funcția extrage tot() pentru a extrage toate fișierele și folderele dintr-un fișier zip în directorul de lucru curent. De asemenea, puteți trece numele unui dosar la extrage tot() pentru a extrage toate fișierele și folderele dintr-un anumit director. Dacă folderul trecut nu există, această metodă va crea una pentru dvs. Iată codul pe care îl puteți utiliza pentru a extrage fișiere:

import zipfile fantasy_zip = zipfile.ZipFile ('C: \\ Povestiri \\ Fantasy \\ archive.zip') fantasy_zip.extractall ('C: \\ Biblioteca \\ Povestiri \\ Fantasy') fantasy_zip.close

Dacă doriți să extrageți mai multe fișiere, va trebui să furnizați numele fișierelor pe care doriți să le extrageți ca listă.

Extragerea fișierelor individuale

Acest lucru este similar cu extragerea mai multor fișiere. O singură diferență este că de data aceasta trebuie să furnizați primul nume de fișier și calea pentru a le extrage mai târziu. De asemenea, trebuie să utilizați extrage() în loc de extrage tot(). Iată un fragment de cod de bază pentru extragerea fișierelor individuale.

import zipfile fantasy_zip = zipfile.ZipFile ('C: \\ Povestiri \\ Fantasy \\ archive.zip') fantasy_zip.extract ('Fantasy Jungle.pdf', 'C: \\ Povestiri \ Fantasy') fantasy_zip.close ) 

Citirea fișierelor zip

Luați în considerare un scenariu în care trebuie să vedeți dacă o arhivă zip conține un anumit fișier. Până în acest moment, singura opțiune de a face acest lucru este extragerea tuturor fișierelor din arhivă. În mod similar, este posibil să fie nevoie să extrageți numai acele fișiere care sunt mai mari decât o anumită dimensiune. fișier Zip modul ne permite să întrebăm despre conținutul unei arhive, fără a fi extras vreodată.

Utilizarea lista de nume() metoda obiectului ZipFile va returna o listă cu toți membrii unei arhive după nume. Pentru a obține informații despre un anumit fișier din arhivă, puteți folosi obtine informatii() metoda obiectului ZipFile. Acest lucru vă va oferi acces la informații specifice acelui fișier, cum ar fi dimensiunea comprimată și necomprimată a fișierului sau ultima modificare a acestuia. Vom reveni la asta mai târziu.

Apelarea obtine informatii() metoda unul câte unul pe toate fișierele poate fi un proces obositor atunci când există o mulțime de fișiere care trebuie procesate. În acest caz, puteți utiliza funcția infolist () pentru a returna o listă care conține un obiect ZipInfo pentru fiecare membru din arhivă. Ordinea acestor obiecte în listă este aceeași cu cea a fișierelor zip. 

De asemenea, puteți citi direct conținutul unui anumit fișier din arhivă folosind citit (fișier) metoda, unde fişier este numele fișierului pe care intenționați să îl citiți. Pentru aceasta, arhiva trebuie să fie deschisă în modul citire sau adăugare.

Pentru a obține dimensiunea comprimată a unui fișier individual din arhivă, puteți utiliza compress_size atribut. În mod similar, pentru a cunoaște mărimea necomprimată, puteți utiliza funcția mărime fișier atribut.

Următorul cod folosește proprietățile și metodele pe care tocmai le-am discutat pentru a extrage numai acele fișiere care au o dimensiune sub 1 MB.

import zipfile stories_zip = zipfile.ZipFile ('C: \\ Stories \\ Funny \\ archive.zip') pentru fișierul în stories_zip.namelist (): if stories_zip.getinfo (file) .file_size < 1024*1024: stories_zip.extract(file, 'C:\\Stories\\Short\\Funny') stories_zip.close()

Pentru a afla data și ora la care a fost modificat ultimul fișier din arhivă, puteți utiliza DATE_TIME atribut. Aceasta va reveni la o tuplă de șase valori. Valorile vor fi anul, luna, ziua lunii, orele, minutele și secundele, în ordinea respectivă. Anul va fi întotdeauna mai mare sau egal cu 1980, iar orele, minutele și secundele sunt bazate pe zero. 

import zipfile stories_zip = zipfile.ZipFile ('C: \\ Povestiri \\ Funny \\ archive.zip') thirsty_crow_info = stories_zip.getinfo ('Thirsty Crow.pdf') print (thirsty_crow_info.date_time) print (thirsty_crow_info.compress_size) print (thirsty_crow_info.file_size) stories_zip.close ()

Aceste informații despre dimensiunea originală a fișierului și mărimea fișierului comprimat vă pot ajuta să decideți dacă merită să comprimați un fișier. Sunt sigur că poate fi folosit și în alte situații.

Gândurile finale

Așa cum este evident din acest tutorial, folosind fișier Zip modulul de compresie a fișierelor vă oferă o mulțime de flexibilitate. Puteți comprima diferite fișiere dintr-un director în diferite arhive pe baza tipului, a numelui sau a dimensiunii acestora. De asemenea, puteți decide dacă doriți să păstrați structura directorului sau nu. În mod similar, în timp ce extrageți fișierele, le puteți extrage la locația pe care o doriți, pe baza propriilor criterii, cum ar fi dimensiunea, etc.

Pentru a fi sincer, a fost, de asemenea, destul de interesant pentru mine să comprim și să extrag fișiere scriind propriul cod. Sper că ți-a plăcut tutorialul și, dacă ai întrebări, te rog să-mi spui în comentariile.

Aflați Python

Aflați Python cu ghidul nostru complet de instrucțiuni Python, indiferent dacă sunteți doar începători sau sunteți un coder experimentat în căutarea unor noi abilități.

Cod