ver varias una obtener nombre leer explorador directorios directorio crear con como carpetas carpeta archivos archivo abrir python directory zip shutil

python - varias - Comprimir el directorio usando shutil.make_archive() mientras preserva la estructura del directorio



obtener nombre de archivo python (1)

Estoy intentando comprimir un directorio llamado test_dicoms en un archivo comprimido llamado test_dicoms.zip usando el siguiente código:

shutil.make_archive(''/home/code/test_dicoms'',''zip'',''/home/code/test_dicoms'')

El problema es que cuando lo descomprimo, todos los archivos que estaban en /test_dicoms/ se extraen en /home/code/ lugar de la carpeta /test_dicoms/ y todos sus archivos contenidos se extraen a /home/code/ . So /test_dicoms/ tiene un archivo llamado foo.txt y después de comprimir y descomprimir la ruta de /home/code/foo.txt es /home/code/foo.txt en lugar de /home/code/test_dicoms/foo.txt . ¿Cómo puedo solucionar esto? Además, algunos de los directorios con los que estoy trabajando son muy grandes. ¿Tendré que agregar algo a mi código para que sea ZIP64 o la función es lo suficientemente inteligente como para hacerlo automáticamente?

Esto es lo que está actualmente en el archivo creado:

[gwarner@jazz gwarner]$ unzip -l test_dicoms.zip Archive: test_dicoms.zip Length Date Time Name --------- ---------- ----- ---- 93324 09-17-2015 16:05 AAscout_b_000070 93332 09-17-2015 16:05 AAscout_b_000125 93332 09-17-2015 16:05 AAscout_b_000248


Usando los términos de la documentación, ha especificado un directorio raíz , pero no un directorio base . Intenta especificar el dir_ base como ese:

shutil.make_archive(''/home/code/test_dicoms'', ''zip'', ''/home/code/'', ''test_dicoms'')

Para responder a su segunda pregunta, depende de la versión de Python que esté utilizando. A partir de Python 3.4, las extensiones ZIP64 estarán disponibles de manera predeterminada. Antes de Python 3.4, make_archive no creará automáticamente un archivo con extensiones ZIP64. Si está utilizando una versión anterior de Python y desea ZIP64, puede invocar directamente el zipfile.ZipFile() subyacente.

Si elige usar zipfile.ZipFile() directamente, sin pasar por shutil.make_archive() , aquí hay un ejemplo:

import zipfile import os d = ''/home/code/test_dicoms'' os.chdir(os.path.dirname(d)) with zipfile.ZipFile(d + ''.zip'', "w", zipfile.ZIP_DEFLATED, allowZip64=True) as zf: for root, _, filenames in os.walk(os.path.basename(d)): for name in filenames: name = os.path.join(root, name) name = os.path.normpath(name) zf.write(name, name)

Referencia: