Atualizado: 04/11/2024

Aquivos ZIP - 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:
    pass

Adicionando 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"))
Política de Privacidade

Copyright © www.programicio.com Todos os direitos reservados

É proibida a reprodução do conteúdo desta página sem autorização prévia do autor.

Contato: programicio@gmail.com