Arquivos ZIP em Python
O formato Zip é o mais popular para compactação e arquivamento de arquivos, e o Python possui um módulo embutido para lidar com eles: o zipfile. Com esse módulo, é possível criar, ler, escrever, listar conteúdos e adicionar arquivos em arquivos Zip. Além disso, ele oferece suporte à criptografia, embora não suporte descriptografia.
ZipFile
Para trabalhar com arquivos Zip, utilizamos a classe ZipFile, que possui o seguinte construtor:
ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, compresslevel=None, *, strict_timestamps=True, metadata_encoding=None)Parâmetros
- file: caminho para o arquivo Zip.
- mode: modo de abertura do arquivo, podendo ser:- 'r': leitura de um arquivo existente.
- 'w': escrita de um novo arquivo.
- 'a': adição ao arquivo existente.
 
- compression: tipo de compactação ao gravar. Valores possíveis:- ZIP_STORED: sem compactação (padrão).
- ZIP_DEFLATED: compressão padrão.
- ZIP_BZIP2: compressão com BZIP2.
- ZIP_LZMA: compressão com LZMA.
 
- allowZip64: permite arquivos maiores que 4 GB quando True.
- compresslevel: nível de compressão, aplicável para- ZIP_DEFLATED(0 a 9) e- ZIP_BZIP2(1 a 9).
- strict_timestamps: quando False, permite trabalhar com arquivos Zip criados antes de 01/01/1980 ou após 31/12/2107.
- metadata_encoding: define a codificação de metadados (como comentários) no arquivo Zip.
Principais Métodos da Classe ZipFile
- close(): fecha o arquivo Zip.
- getinfo(): retorna informações sobre um arquivo no Zip como um objeto ZipInfo.
- namelist(): retorna uma lista com os nomes dos arquivos no Zip.
- infolist(): retorna informações sobre todos os arquivos no Zip como uma lista de objetos ZipInfo.
- open(): abre um arquivo específico no Zip.
- read(): lê o conteúdo de um arquivo no Zip em bytes.
- extract(): extrai um arquivo do Zip.
- extractall(): extrai todos os arquivos do Zip.
- setpassword(): define uma senha para o arquivo Zip.
- printdir(): exibe o conteúdo do Zip no console.
Criando um Arquivo Zip
Para criar um arquivo Zip, utilize o modo "w" ou "a" no construtor ZipFile:
from zipfile import ZipFile
myzip = ZipFile("programicio.zip", "w")Ao finalizar, é necessário fechar o arquivo com close():
from zipfile import ZipFile
myzip = ZipFile("programicio.zip", "w")
myzip.close()O ZipFile também pode ser usado como um gerenciador de contexto com with, que automaticamente fecha o arquivo ao final:
from zipfile import ZipFile
with ZipFile("programicio.zip", "w") as myzip:
    passAdicionando Arquivos ao Zip
Para adicionar arquivos ao Zip, utilize o método write():
from zipfile import ZipFile
with ZipFile("programicio.zip", "w") as myzip:
    myzip.write("hello.txt")Ao abrir em modo "w", o conteúdo anterior do arquivo Zip será substituído. Para adicionar sem sobrescrever, utilize o modo "a":
from zipfile import ZipFile
with ZipFile("programicio.zip", "a") as myzip:
    myzip.write("hello_world.txt")
    myzip.write("forest.jpg")Para aplicar compressão, especifique o tipo e o nível:
from zipfile import ZipFile, ZIP_DEFLATED
with ZipFile("programicio.zip", "w", compression=ZIP_DEFLATED, compresslevel=3) as myzip:
    myzip.write("hello.txt")Para evitar duplicidade de nomes dentro do Zip, forneça um nome exclusivo no segundo parâmetro de write():
from zipfile import ZipFile
with ZipFile("programicio.zip", "a") as myzip:
    myzip.write("hello.txt", "hello1.txt")
    myzip.write("hello.txt", "hello2.txt")Obtendo Informações do Zip
O método infolist() retorna informações detalhadas de cada arquivo:
from zipfile import ZipFile
with ZipFile("programicio.zip", "a") as myzip:
    print(myzip.infolist())A classe ZipInfo possui os seguintes atributos:
- filename: nome do arquivo.
- date_time: data e hora da última modificação.
- compress_type: tipo de compressão.
- compress_size: tamanho após compressão.
- file_size: tamanho original.
Exemplo de leitura das informações de cada arquivo:
from zipfile import ZipFile
with ZipFile("programicio.zip", "r") as myzip:
    for item in myzip.infolist():
        print(f"File Name: {item.filename} Date: {item.date_time} Size: {item.file_size}")Exemplo de saída:
File Name: hello.txt Date: (2024, 11, 23, 20, 21, 34) Size: 12 File Name: forest.jpg Date: (2024, 11, 19, 20, 46, 52) Size: 103956 File Name: hello1.txt Date: (2024, 11, 23, 20, 21, 34) Size: 12 File Name: hello2.txt Date: (2024, 11, 23, 20, 21, 34) Size: 12
Para verificar se um elemento é uma pasta, use is_dir():
from zipfile import ZipFile
with ZipFile("programicio.zip", "r") as myzip:
    for item in myzip.infolist():
        if item.is_dir():
            print(f"Pasta: {item.filename}")
        else:
            print(f"Arquivo: {item.filename}")Extraindo Arquivos do Zip
Para extrair todos os arquivos, utilize o método extractall():
from zipfile import ZipFile
with ZipFile("programicio.zip", "r") as myzip:
    myzip.extractall()Para extrair para uma pasta específica:
from zipfile import ZipFile
with ZipFile("programicio.zip", "r") as myzip:
    myzip.extractall(path="C://somedir/")Para extrair um arquivo específico:
myzip.extract("hello.txt")Leitura de Arquivo
O método read() lê o conteúdo de um arquivo no Zip como bytes:
from zipfile import ZipFile
with ZipFile("programicio.zip", "r") as myzip:
    content = myzip.read("hello.txt")
    print(content)Abertura de Arquivo
O método open() permite abrir um arquivo dentro do Zip sem extraí-lo:
from zipfile import ZipFile
with ZipFile("programicio.zip", "r") as myzip:
    content = myzip.read("hello.txt")
    print(content.decode("utf-8"))Documentação oficial: