2010-08-31 43 views
8

Duplicar posible:
How do I zip the contents of a folder using python (version 2.5)?¿Mejor manera de comprimir archivos en Python (comprimir todo un directorio con un solo comando)?

Supongamos que tengo un directorio: /home/user/files/. Este directorio tiene un montón de archivos:

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

que quiere comprimir este directorio utilizando ZipFile en Python. ¿Necesito loop through the directory and add these files recursively, o es posible pasar el nombre del directorio y la clase ZipFile agrega automáticamente todo lo que está debajo?

Al final, me gustaría tener:

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

Desde os.walk produce todo el contenido del directorio - haciendo la recursividad para usted - parece como un trivial lazo. ¿Qué estás tratando de optimizar? ¿Líneas de código? No veo cómo. ¿Hora? No es posible - Zip toma el tiempo que toma. ¿Qué problema estás teniendo? –

+0

Solo quiero comprimir una carpeta que puede tener carpetas vacías, sin codificar un montón de líneas para algo que mi máquina Linux puede hacer con un solo comando usando la utilidad zip y el módulo de subproceso. –

Respuesta

1

Usted podría utilizar subprocess módulo:

import subprocess 

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

El código no se ha probado y se hace pasar a las obras justo en las máquinas UNIX, que no sé si las ventanas tienen utilidades de línea de comandos similares.

+0

¡Ya estoy usando un subproceso en otra sección de mi script, esto es lo que estaba buscando! No pensé en usar zip de * nixes machines, ¡gracias! –

6

Usted podría tratar de usar el paquete distutils:

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

También podría ser capaz de salirse con la suya utilizando el comando zip disponible en el shell de Unix con una llamada a os.system

23

Tenga en cuenta que esto no incluye directorios vacíos. Si se requieren, hay soluciones disponibles en la web; probablemente sea mejor obtener el registro de ZipInfo para directorios vacíos en nuestros programas de archivo favoritos para ver qué hay en ellos.

archivo hardcoding/ruta para deshacerse de detalles de mi código ...

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:]) 
Cuestiones relacionadas