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: