En este artículo discutiremos cómo crear un archivo zip a partir de archivos seleccionados o archivos de un directorio basado en filtros.
El módulo zipfile de Python proporciona una clase ZipFile para cosas relacionadas con archivos zip. Vamos a usar esto para crear un archivo zip.
Primero importa la clase del módulo i.e.
from zipfile import ZipFile
Crea un archivo zip a partir de múltiples archivos en Python
Los pasos son,
- Crea un objeto ZipFile pasando el nuevo nombre del archivo y el modo como ‘w’ (modo de escritura). Creará un nuevo archivo zip y lo abrirá dentro del objeto ZipFile.
- Llamar a la función write() en el objeto ZipFile para añadir los archivos en él.
- Llamar a close() en el objeto ZipFile para cerrar el archivo zip.
Creará un archivo zip ‘sample.zip’ con los archivos dados dentro de él.
Podemos hacer lo mismo con «with open» . Se cerrará automáticamente el archivo zip cuando el objeto ZipFile sale del ámbito es decir.
Crear un archivo zip de un directorio
Para comprimir todo el contenido de un directorio en un archivo zip, tenemos que iterar sobre todos los archivos en el directorio y sus subdirectorios, a continuación, añadir cada entrada al archivo zip utilizando ZipFile.write()
from zipfile import ZipFileimport osfrom os.path import basename# create a ZipFile objectwith ZipFile('sampleDir.zip', 'w') as zipObj: # Iterate over all the files in directory for folderName, subfolders, filenames in os.walk(dirName): for filename in filenames: #create complete filepath of file in directory filePath = os.path.join(folderName, filename) # Add file to zip zipObj.write(filePath, basename(filePath))
Se comprimirá todo el contenido de un directorio en un solo archivo zip i..e ‘sampleDir.zip’. Su contenido será,
Comprimir los archivos seleccionados de un directorio basado en el filtro o comodines
Para comprimir los archivos seleccionados de un directorio tenemos que comprobar la condición en cada ruta de archivo, mientras que la iteración antes de añadirlo al archivo zip.
Creemos la función que Itera sobre un directorio y filtrar el contenido con devolución de llamada dada. Los archivos que pasan el filtro sólo se añadirá en zip i.e.
from zipfile import ZipFileimport osfrom os.path import basename# Zip the files from given directory that matches the filterdef zipFilesInDir(dirName, zipFileName, filter): # create a ZipFile object with ZipFile(zipFileName, 'w') as zipObj: # Iterate over all the files in directory for folderName, subfolders, filenames in os.walk(dirName): for filename in filenames: if filter(filename): # create complete filepath of file in directory filePath = os.path.join(folderName, filename) # Add file to zip zipObj.write(filePath, basename(filePath))
Vamos a zip sólo los archivos csv de un directorio i.e. pasar una función lambda como argumento in it.
zipFilesInDir('sampleDir', 'sampleDir2.zip', lambda name : 'csv' in name)
Se creará un archivo zip ‘sampleDir2.zip’ con todos los archivos csv de given directory.
Complete ejemplo es el siguiente: