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