python - rutas - ruta relativa
python/zip: ¿cómo eliminar la ruta absoluta en el archivo zip si se proporcionan rutas absolutas para los archivos? (3)
El método zipfile write () admite un argumento adicional (arcname) que es el nombre del archivo comprimido que se almacenará en el archivo comprimido, por lo que solo deberá cambiar el código con:
from os.path import basename
...
zip.write(first_path, basename(first_path))
zip.write(second_path, basename(second_path))
zip.close()
Cuando tenga tiempo libre para leer, la documentación para el zipfile será útil.
Tengo dos archivos en dos directorios diferentes, uno es ''/home/test/first/first.pdf''
, el otro es ''/home/text/second/second.pdf''
. Uso el siguiente código para comprimirlos:
import zipfile, StringIO
buffer = StringIO.StringIO()
first_path = ''/home/test/first/first.pdf''
second_path = ''/home/text/second/second.pdf''
zip = zipfile.ZipFile(buffer, ''w'')
zip.write(first_path)
zip.write(second_path)
zip.close()
Después de abrir el archivo zip que creé, tengo una carpeta de home
en ella, luego hay dos subcarpetas, first
y second
, luego los archivos pdf. No sé cómo incluir solo dos archivos pdf en lugar de tener la ruta completa comprimida en el archivo zip. Espero aclarar mi pregunta, por favor ayuda. Gracias.
Sospecho que podría haber una solución más elegante, pero esta debería funcionar:
def add_zip_flat(zip, filename):
dir, base_filename = os.path.split(filename)
os.chdir(dir)
zip.write(base_filename)
zip = zipfile.ZipFile(buffer, ''w'')
add_zip_flat(zip, first_path)
add_zip_flat(zip, second_path)
zip.close()
Uso esta función para comprimir un directorio sin incluir la ruta absoluta
import zipfile
import os
def zipDir(dirPath, zipPath):
zipf = zipfile.ZipFile(zipPath , mode=''w'')
lenDirPath = len(dirPath)
for root, _ , files in os.walk(dirPath):
for file in files:
filePath = os.path.join(root, file)
zipf.write(filePath , filePath[lenDirPath :] )
zipf.close()
#end zipDir