Neste artigo vamos discutir como criar um arquivo zip a partir de arquivos selecionados ou arquivos de um diretório baseado em filtros.
O módulo de arquivos zip do Python fornece uma classe ZipFile para coisas relacionadas a arquivos zip. Vamos usar isto para criar um arquivo zip.
Primeiro importar a classe do módulo i.e.
from zipfile import ZipFile
Criar um arquivo zip a partir de múltiplos arquivos em Python
Passos são,
- Criar um objeto ZipFile passando o novo nome do arquivo e modo como ‘w’ (modo de escrita). Ele irá criar um novo arquivo zip e abri-lo dentro do objeto ZipFile.
- Call write() no objeto ZipFile para adicionar os arquivos nele.
- call close() no objeto ZipFile para Fechar o arquivo zip.
Criará um arquivo zip ‘sample.zip’ com determinados arquivos dentro dele.
Nós podemos fazer a mesma coisa com “com aberto” . Ele fechará automaticamente o arquivo zip quando o objeto ZipFile sair do escopo, ou seja,
Criar um arquivo zip de um diretório
Para zipar todo o conteúdo de um diretório em um arquivo zip, precisamos iterar sobre todos os arquivos em um diretório e seus subdiretórios, depois adicionar cada entrada ao arquivo zip usando o 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))
Irá zipar todo o conteúdo de um diretório em um único arquivo zip, ou seja, ‘sampleDir.zip’. Seu conteúdo será,
Zip selected files from a directory based on filter or wildcards
Para zipar arquivos selecionados de um diretório, precisamos verificar a condição de cada caminho de arquivo enquanto iterativo antes de adicioná-lo ao arquivo zip.
Criemos uma função que Itera por cima de um diretório e filtremos o conteúdo com um determinado callback. Os ficheiros que passarem o filtro só serão adicionados em zip, ou seja,
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))
Só ficheiros zip csv de um directório, ou seja, passar uma função lambda como argumento nele.
zipFilesInDir('sampleDir', 'sampleDir2.zip', lambda name : 'csv' in name)
Criará um arquivo zip ‘sampleDir2.zip’ com todos os ficheiros csv de um directório dado.
Exemplo completo é o seguinte: