Estoy tratando de comprimir un solo archivo en python. Por alguna razón, me está costando entender la sintaxis. Lo que estoy tratando de hacer es mantener el archivo original y crear un nuevo archivo comprimido del original (como lo que haría una Mac o Windows si archiva un archivo).
Esto es lo que tengo hasta ahora:
import zipfile myfilepath = '/tmp/%s' % self.file_name myzippath = myfilepath.replace('.xml', '.zip') zipfile.ZipFile(myzippath, 'w').write(open(myfilepath).read()) # does not zip the file properlySi el archivo que se va a comprimir ( filename ) está en un directorio diferente llamado pathname , debe usar el parámetro arcname . De lo contrario, volverá a crear la jerarquía de carpetas completa en la carpeta de archivos.
from zipfile import ZipFile import os with ZipFile(zip_file, 'w') as zipf: zipf.write(os.path.join(pathname,filename), arcname=filename)La forma correcta de comprimir el archivo es:
zipfile.ZipFile('hello.zip', mode='w').write("hello.csv") # assume your xxx.py under the same dir with hello.csvEl documento oficial de Python dice :
ZipFile.write(filename, arcname=None, compress_type=None)Escriba el archivo llamado nombre de archivo en el archivo, dándole el nombre de archivo arcname
Pasas open(filename).read() a write() . open(filename).read() es una sola cadena que contiene todo el contenido del archivo filename , arrojaría FileNotFoundError porque está tratando de encontrar un archivo con el nombre del contenido de la cadena.
¿Intenta llamar a zipfile.close() después?
from zipfile import ZipFile zipf = ZipFile("main.zip","w", zipfile.ZIP_DEFLATED) zipf.write("main.json") zipf.close()