Como compactar e descompactar arquivos usando Python
Se você estiver criando um aplicativo que lida com arquivos, considere usar zip para economizar espaço.
Compactar é uma maneira elegante de compactar vários arquivos e combiná-los em um único. Isso economiza não apenas espaço de armazenamento, mas também largura de banda ao transferir um arquivo pela rede. Uma das melhores características do zip é que ele funciona em todas as principais plataformas: Windows, Linux e Mac.
Zip usa compactação sem perdas para reter todos os dados ao compactá-los e descompactá-los. Você também pode criptografar e descriptografar seus arquivos zip.
Com tantos recursos para explorar, descubra como você pode ler, compactar e descompactar arquivos usando o módulo zipfile do Python.
O que é o módulo zipfile?
Você pode usar o módulo zipfile padrão para manipular arquivos zip usando Python. Com este módulo, você pode abrir e ler arquivos zip, ler seus metadados, criar um arquivo zip, compactá-lo e descompactar arquivos. Existem três métodos de compactação disponíveis: Deflate, Bzip2 e LZMA.
Uma das coisas que falta ao módulo é a capacidade de lidar com arquivos de vários discos, mas ele suporta a extensão ZIP64. Ele também pode descriptografar arquivos zip, mas não criptografá-los. Usando o módulo zipfile você pode obter metadados do arquivo zip, como a data e hora da modificação. Você também pode obter detalhes como o sistema operacional usado para criar o arquivo, a versão do zip e o tamanho do arquivo no formato compactado e descompactado.
Como compactar arquivos usando Python
Você pode compactar vários arquivos em um arquivo usando o módulo zipfile do Python. Importe o módulo ZipFile do pacote zipfile para executar as operações zip necessárias. Importe também o módulo os para selecionar e salvar arquivos.
Defina uma função get_all_file_paths(). Ele deve aceitar um parâmetro de diretório que contenha o caminho para a pasta que contém os arquivos a serem compactados.
Inicialize uma lista vazia que armazenará a lista de caminhos de arquivos. Use um loop for para obter o conteúdo completo do diretório de destino usando a função os.walk(). Esta função busca os nomes dos arquivos em uma árvore de diretórios movendo-se ao longo dela em uma abordagem de cima para baixo ou de baixo para cima. Para cada diretório, a função retorna uma tupla de três contendo root, dirs e arquivos.
A raiz é uma string que contém o caminho completo para o diretório. A lista dirs inclui todos os subdiretórios contidos no diretório. A lista de arquivos contém todos os arquivos presentes no diretório.
Dentro do loop, declare outro loop para iterar na lista de arquivos. Use a função os.path.join() para combinar o nome do diretório com cada nome de arquivo para criar um caminho completo. Em seguida, anexe este nome de arquivo completo à lista que você criou anteriormente. Assim que esta operação terminar, retorne a lista de caminhos de arquivo.
# import the required modules
from zipfile import ZipFile
import os
# create a function to get all the file paths
def get_all_file_paths(directory):
# initializing empty list to store file paths
file_paths = []
# navigate through the files
for root, directories, files in os.walk(directory):
for filename in files:
# join the root and filename to create a complete file path
filepath = os.path.join(root, filename)
file_paths.append(filepath)
# returning all file paths
return file_paths
Armazene o caminho para a pasta que contém os arquivos que você deseja compactar em uma variável chamada diretório. Chame a função get_all_file_paths() que você criou anteriormente e armazene o valor que ela retorna em file_paths.
Exiba uma mensagem ao usuário para que ele saiba que esses são os arquivos que o programa irá compactar. Itere sobre os arquivos e exiba seus nomes.
Passe o nome que você deseja que seu arquivo zip tenha junto com a especificação de que o programa retorna um arquivo gravável usando a instrução with para lidar com exceções. Itere cada arquivo e use a função write() no arquivo gravável em um arquivo zip.
Quando a operação for concluída, envie uma mensagem explicando que o programa compactado todos os arquivos com sucesso.
# path to folder you want to zip
directory = './pythonzip'
# calling function to get all file paths in the directory
file_paths = get_all_file_paths(directory)
# printing the list of all files you want to zip
print('List of files that will be zipped:')
for file_name in file_paths:
print(file_name)
# writing files to a zipfile
with ZipFile('my_file.zip', 'w') as zip:
# write each file one by one
for file in file_paths:
zip.write(file)
print('All files are zipped!')
Como descompactar arquivos usando Python
A implementação da descompactação de arquivos usando o módulo zipfile é muito mais fácil. Importe o pacotezipfiledo módulo ZipFile e armazene o nome do arquivo zip que deseja extrair em uma variável. Use a instrução with para lidar com exceções e abrir o arquivo que deseja extrair no modo de leitura. Use a função printdir() para exibir o índice dos arquivos presentes no zip.
Exiba uma mensagem de progresso informando que você está extraindo os arquivos e use a função extractall() para extrair o conteúdo do arquivo zip para o diretório de trabalho atual. Alternativamente, você pode incluir um parâmetro path para alterar o caminho onde o programa extrai os arquivos.
Exiba uma mensagem usando a instrução print na conclusão da operação.
# importing the required modules
from zipfile import ZipFile
# pass the name of the zip file you want to extract
file_name = "extract.zip"
# opening the zip file in read mode
with ZipFile(file_name, 'r') as zip:
# display the contents of the zip file
zip.printdir()
# extracting all the files
print('Extract in progress...')
zip.extractall()
print('All files are extracted!')
Mais sobre arquivos Zip
Os arquivos Zip ganharam muita popularidade e estão em uso há décadas. Sites populares como GitHub e Google Drive permitem baixar uma coleção de arquivos como um arquivo zip. O programa zip compacta um conjunto de arquivos em um único pacote. Isso contrasta com uma ferramenta como o tar, que empacota os arquivos, mas não os compacta.
Se você deseja criptografar seus arquivos usando um algoritmo mais eficiente, os arquivos RAR são a melhor opção. RAR usa o algoritmo AES-128 que é melhor que o algoritmo deflate usado por arquivos zip. Por fim, escolha aquele que melhor atende à sua necessidade.