archivo zip y evitar la estructura de directorios

Tengo un script en Python que comprime un archivo ( new.txt ).

 tofile = "/root/files/result/"+file targetzipfile = new.zip # This is how I want my zip to look like zf = zipfile.ZipFile(targetzipfile, mode='w') try: #adding to archive zf.write(tofile) finally: zf.close() 

Cuando hago esto me sale el archivo zip. Pero cuando bash descomprimir el archivo, obtengo el archivo de texto dentro de una serie de directorios correspondientes a la ruta del archivo, es decir, veo una carpeta llamada root en el directorio de result y más directorios dentro de él, es decir, tengo

/root/files/result/new.zip

y cuando descomprimo new.zip tengo una estructura de directorios que parece

 /root/files/result/root/files/result/new.txt. 

¿Hay alguna forma en que pueda comprimir de manera tal que cuando descomprimo solo obtenga new.txt ?

En otras palabras, tengo /root/files/result/new.zip y cuando descomprimo new.zip , debería verse como

 /root/files/results/new.txt 

El método zipfile.write() toma un argumento opcional de nombre de arcname que especifica cuál debe ser el nombre del archivo dentro del archivo zip

Creo que necesitas hacer una modificación para el destino, de lo contrario duplicará el directorio. Usa: arcname para evitarlo. prueba de esta manera:

 import os import zipfile def zip(src, dst): zf = zipfile.ZipFile("%s.zip" % (dst), "w", zipfile.ZIP_DEFLATED) abs_src = os.path.abspath(src) for dirname, subdirs, files in os.walk(src): for filename in files: absname = os.path.abspath(os.path.join(dirname, filename)) arcname = absname[len(abs_src) + 1:] print 'zipping %s as %s' % (os.path.join(dirname, filename), arcname) zf.write(absname, arcname) zf.close() zip("src", "dst") 
 zf.write(tofile) 

cambiar

 zf.write(tofile, zipfile_dir) 

por ejemplo

 zf.write("/root/files/result/root/files/result/new.txt", "/root/files/results/new.txt") 

Echa un vistazo a la documentación para Zipfile.write .

ZipFile.write (nombre de archivo [, nombre de arco [, tipo de compresión]]) Escriba el archivo llamado nombre de archivo en el archivo, dándole el nombre de archivo nombre de archivo (de forma predeterminada, será el mismo que el nombre de archivo, pero sin una letra de unidad y con la ruta principal) separadores removidos)

https://docs.python.org/2/library/zipfile.html#zipfile.ZipFile.write

Intente lo siguiente:

 import zipfile import os filename = 'foo.txt' # Using os.path.join is better than using '/' it is OS agnostic path = os.path.join(os.path.sep, 'tmp', 'bar', 'baz', filename) zip_filename = os.path.splitext(filename)[0] + '.zip' zip_path = os.path.join(os.path.dirname(path), zip_filename) # If you need exception handling wrap this in a try/except block with zipfile.ZipFile(zip_path, 'w') as zf: zf.write(path, zip_filename) 

La línea de fondo es que si no proporciona un nombre de archivo, el nombre del archivo se utiliza como nombre de archivo y contendrá la ruta completa al archivo.

Puede aislar solo el nombre de archivo de sus archivos de fonts usando:

 name_file_only= name_full_path.split(os.sep)[-1] 

Por ejemplo, si name_full_path es /root/files/results/myfile.txt , entonces name_file_only será myfile.txt . Para comprimir myfile.txt a la raíz del archivo zf , puede usar:

 zf.write(name_full_path, name_file_only) 

Para ilustrar más claramente,

estructura de directorios:

 /Users └── /user . ├── /pixmaps . │ ├── pixmap_00.raw . │ ├── pixmap_01.raw │ ├── /jpeg │ │ ├── pixmap_00.jpg │ │ └── pixmap_01.jpg │ └── /png │ ├── pixmap_00.png │ └── pixmap_01.png ├── /docs ├── /programs ├── /misc . . . 

Directorio de interés: / Users / user / pixmaps

Primer bash

 import os import zipfile TARGET_DIRECTORY = "/Users/user/pixmaps" ZIPFILE_NAME = "CompressedDir.zip" def zip_dir(directory, zipname): """ Compress a directory (ZIP file). """ if os.path.exists(directory): outZipFile = zipfile.ZipFile(zipname, 'w', zipfile.ZIP_DEFLATED) for dirpath, dirnames, filenames in os.walk(directory): for filename in filenames: filepath = os.path.join(dirpath, filename) outZipFile.write(filepath) outZipFile.close() if __name__ == '__main__': zip_dir(TARGET_DIRECTORY, ZIPFILE_NAME) 

Estructura de archivos ZIP:

 CompressedDir.zip . └── /Users └── /user └── /pixmaps ├── pixmap_00.raw ├── pixmap_01.raw ├── /jpeg │ ├── pixmap_00.jpg │ └── pixmap_01.jpg └── /png ├── pixmap_00.png └── pixmap_01.png 

Evitando la ruta completa del directorio

 def zip_dir(directory, zipname): """ Compress a directory (ZIP file). """ if os.path.exists(directory): outZipFile = zipfile.ZipFile(zipname, 'w', zipfile.ZIP_DEFLATED) # The root directory within the ZIP file. rootdir = os.path.basename(directory) for dirpath, dirnames, filenames in os.walk(directory): for filename in filenames: # Write the file named filename to the archive, # giving it the archive name 'arcname'. filepath = os.path.join(dirpath, filename) parentpath = os.path.relpath(filepath, directory) arcname = os.path.join(rootdir, parentpath) outZipFile.write(filepath, arcname) outZipFile.close() if __name__ == '__main__': zip_dir(TARGET_DIRECTORY, ZIPFILE_NAME) 

Estructura de archivos ZIP:

 CompressedDir.zip . └── /pixmaps ├── pixmap_00.raw ├── pixmap_01.raw ├── /jpeg │ ├── pixmap_00.jpg │ └── pixmap_01.jpg └── /png ├── pixmap_00.png └── pixmap_01.png