2010-08-31 22 views
8

Eventuali duplicati:
How do I zip the contents of a folder using python (version 2.5)?Un modo migliore per comprimere i file in Python (comprimere un'intera directory con un singolo comando)?

Supponiamo che io sono una directory: /home/user/files/. Questo dir ha un gruppo di file:

/home/user/files/ 
    -- test.py 
    -- config.py 

Voglio zip questa directory utilizzando ZipFile in Python. Devo specificare loop through the directory and add these files recursively oppure è possibile passare il nome della directory e la classe ZipFile aggiunge automaticamente tutto ciò che si trova al di sotto?

Alla fine, mi piacerebbe avere:

/home/user/files.zip (and inside my zip, I dont need to have a /files folder inside the zip:) 
    -- test.py 
    -- config.py 
+2

Dal os.walk cede l'intero contenuto della directory - facendo la ricorsione per voi - sembra una banale ciclo continuo. Cosa stai cercando di ottimizzare? Linee di codice? Non vedo come. Tempo? Non è possibile - Zip prende il tempo necessario. Che problema stai avendo? –

+0

Voglio solo comprimere una cartella che potrebbe avere cartelle vuote, senza codificare un gruppo di linee per qualcosa che la mia macchina Linux può fare con un singolo comando usando l'utility zip e il modulo subprocess. –

risposta

1

Si potrebbe utilizzare subprocess modulo:

import subprocess 

PIPE = subprocess.PIPE 
pd = subprocess.Popen(['/usr/bin/zip', '-r', 'files', 'files'], 
         stdout=PIPE, stderr=PIPE) 
stdout, stderr = pd.communicate() 

Il codice non è testato e finge di lavori solo su macchine UNIX, non so se le finestre non ha simili utility a riga di comando.

+0

Sto già usando il sottoprocesso in un'altra sezione del mio script, questo è quello che stavo cercando! Non ho pensato all'utilizzo di zip da macchine * nixes, grazie! –

6

Si potrebbe provare a utilizzare il pacchetto distutils:

distutils.archive_util.make_zipfile(base_name, base_dir[, verbose=0, dry_run=0]) 
2

Si potrebbe anche essere in grado di farla franca con utilizzando il comando zip disponibili nella shell di Unix con una chiamata a os.system

23

Si noti che questo non include le directory vuote. Se sono necessari, sono disponibili soluzioni alternative sul Web; probabilmente meglio ottenere il record ZipInfo per le directory vuote nei nostri programmi di archiviazione preferiti per vedere cosa c'è dentro.

hardcoding file/percorso per sbarazzarsi di specifiche del mio codice ...

target_dir = '/tmp/zip_me_up' 
zip = zipfile.ZipFile('/tmp/example.zip', 'w', zipfile.ZIP_DEFLATED) 
rootlen = len(target_dir) + 1 
for base, dirs, files in os.walk(target_dir): 
    for file in files: 
     fn = os.path.join(base, file) 
     zip.write(fn, fn[rootlen:]) 
Problemi correlati