Comprimere ed estrarre file in Python

Se hai utilizzato i computer per un po 'di tempo, probabilmente hai trovato i file con .cerniera lampo estensione. Sono file speciali che possono contenere il contenuto compresso di molti altri file, cartelle e sottocartelle. Questo li rende piuttosto utili per il trasferimento di file su Internet. Sapevi che puoi usare Python per comprimere o estrarre file?

Questo tutorial ti insegnerà come usare il file zip modulo in Python, per estrarre o comprimere singoli o più file contemporaneamente.

Comprimere singoli file

Questo è facile e richiede pochissimo codice. Iniziamo importando il file zip modulo e quindi aprire l'oggetto ZipFile in modalità di scrittura specificando il secondo parametro come 'w'. Il primo parametro è il percorso del file stesso. Ecco il codice che ti serve:

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

Si noti che specificherò il percorso in tutti i frammenti di codice in un formato di stile Windows; sarà necessario apportare le modifiche appropriate se si è su Linux o Mac.

È possibile specificare diversi metodi di compressione per comprimere i file. I nuovi metodi BZIP2 e LZMA sono stati aggiunti in Python versione 3.3 e ci sono anche altri strumenti che non supportano questi due metodi di compressione. Per questo motivo, è sicuro usare solo il sgonfio metodo. Dovresti comunque provare questi metodi per vedere la differenza nella dimensione del file compresso.

Comprimere più file

Questo è leggermente complesso in quanto è necessario eseguire un'iterazione su tutti i file. Il seguente codice dovrebbe comprimere tutti i file con estensione pdf in una determinata cartella:

import os import zipfile fantasy_zip = zipfile.ZipFile ('C: \\ Stories \\ Fantasy \\ archive.zip', 'w') per cartella, sottocartelle, file in os.walk ('C: \\ Stories \\ Fantasy '): per file in file: if file.endswith ('. pdf '): fantasy_zip.write (os.path.join (cartella, file), os.path.relpath (os.path.join (cartella, file) , 'C: \\ Stories \\ Fantasy'), compress_type = zipfile.ZIP_DEFLATED) fantasy_zip.close () 

Questa volta, abbiamo importato il os modulo e usato il suo camminare() metodo per esaminare tutti i file e le sottocartelle all'interno della nostra cartella originale. Sto solo comprimendo i file pdf nella directory. Puoi anche creare diversi file archiviati per ogni formato usando Se dichiarazioni.

Se non vuoi conservare la struttura della directory, puoi mettere insieme tutti i file usando la seguente riga:

fantasy_zip.write (os.path.join (cartella, file), file, compress_type = zipfile.ZIP_DEFLATED)

Il Scrivi() il metodo accetta tre parametri. Il primo parametro è il nome del nostro file che vogliamo comprimere. Il secondo parametro è facoltativo e consente di specificare un nome file diverso per il file compresso. Se non viene specificato nulla, viene utilizzato il nome originale.

Estrazione di tutti i file

Puoi usare il estrai tutto() metodo per estrarre tutti i file e le cartelle da un file zip nella directory di lavoro corrente. Puoi anche passare il nome di una cartella a estrai tutto() per estrarre tutti i file e le cartelle in una directory specifica. Se la cartella che hai passato non esiste, questo metodo ne creerà uno per te. Ecco il codice che è possibile utilizzare per estrarre i file:

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

Se si desidera estrarre più file, sarà necessario fornire il nome dei file che si desidera estrarre come un elenco.

Estrazione di singoli file

Questo è simile all'estrazione di più file. Una differenza è che questa volta è necessario fornire prima il nome file e il percorso per estrarli in un secondo momento. Inoltre, è necessario utilizzare il estratto() metodo invece di estrai tutto(). Ecco uno snippet di codice di base per estrarre singoli file.

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

Leggere i file zip

Considerare uno scenario in cui è necessario verificare se un archivio zip contiene un file specifico. Fino a questo punto, la tua unica possibilità è estrarre tutti i file nell'archivio. Allo stesso modo, potrebbe essere necessario estrarre solo quei file che sono più grandi di una dimensione specifica. Il file zip modulo ci consente di informarci sui contenuti di un archivio senza mai estrarlo.

Usando il Lista di nomi() il metodo dell'oggetto ZipFile restituirà un elenco di tutti i membri di un archivio per nome. Per ottenere informazioni su un file specifico nell'archivio, è possibile utilizzare il ottenere informazioni() metodo dell'oggetto ZipFile. Questo ti darà accesso alle informazioni specifiche per quel file, come la dimensione compressa e non compressa del file o la sua ultima ora di modifica. Torneremo su dopo.

Chiamando il ottenere informazioni() il metodo uno per uno su tutti i file può essere un processo faticoso quando ci sono molti file che devono essere elaborati. In questo caso, puoi usare il lista info () metodo per restituire un elenco contenente un oggetto ZipInfo per ogni singolo membro nell'archivio. L'ordine di questi oggetti nell'elenco è uguale a quello dei file zip effettivi. 

Puoi anche leggere direttamente il contenuto di un file specifico dall'archivio usando il lettura (file) metodo, dove file è il nome del file che intendi leggere. Per fare ciò, l'archivio deve essere aperto in modalità lettura o aggiunta.

Per ottenere la dimensione compressa di un singolo file dall'archivio, è possibile utilizzare compress_size attributo. Allo stesso modo, per conoscere la dimensione non compressa, puoi usare il dimensione del file attributo.

Il codice seguente utilizza le proprietà e i metodi appena discussi per estrarre solo i file con dimensioni inferiori a 1 MB.

import zipfile stories_zip = zipfile.ZipFile ('C: \\ Stories \\ Funny \\ archive.zip') per il file in stories_zip.namelist (): if stories_zip.getinfo (file) .file_size < 1024*1024: stories_zip.extract(file, 'C:\\Stories\\Short\\Funny') stories_zip.close()

Per conoscere l'ora e la data in cui è stato modificato l'ultimo file dall'archivio, è possibile utilizzare il comando appuntamento attributo. Ciò restituirà una tupla di sei valori. I valori saranno l'anno, il mese, il giorno del mese, le ore, i minuti e i secondi, in quell'ordine specifico. L'anno sarà sempre maggiore o uguale al 1980 e ore, minuti e secondi sono basati su zero. 

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

Queste informazioni sulla dimensione del file originale e la dimensione del file compresso possono aiutarti a decidere se vale la pena comprimere un file. Sono sicuro che può essere usato anche in altre situazioni.

Pensieri finali

Come evidente da questo tutorial, usando il file zip il modulo per comprimere i file ti dà molta flessibilità. È possibile comprimere diversi file in una directory in diversi archivi in ​​base al loro tipo, nome o dimensione. Puoi anche decidere se vuoi preservare la struttura della directory o meno. Allo stesso modo, mentre estrai i file, puoi estrarli nella posizione che desideri, in base ai tuoi criteri come dimensioni, ecc.

Ad essere onesti, è stato anche molto interessante per me comprimere ed estrarre i file scrivendo il mio codice. Spero ti sia piaciuto il tutorial e, se hai qualche domanda, per favore fammelo sapere nei commenti.

Impara Python

Impara Python con la nostra guida completa al tutorial su Python, sia che tu stia appena iniziando o che sei un programmatore esperto che cerca di imparare nuove abilità.