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
ZipFile
Para trabalhar com arquivos Zip, utilizamos a classe ZipFile
ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, compresslevel=None, *, strict_timestamps=True, metadata_encoding=None)
Parâmetros
: caminho para o arquivo Zip.file
: modo de abertura do arquivo, podendo ser:mode
: leitura de um arquivo existente.'r'
: escrita de um novo arquivo.'w'
: adição ao arquivo existente.'a'
: tipo de compactação ao gravar. Valores possíveis:compression
: sem compactação (padrão).ZIP_STORED
: compressão padrão.ZIP_DEFLATED
: compressão com BZIP2.ZIP_BZIP2
: compressão com LZMA.ZIP_LZMA
: permite arquivos maiores que 4 GB quando True.allowZip64
: nível de compressão, aplicável paracompresslevel
(0 a 9) eZIP_DEFLATED
(1 a 9).ZIP_BZIP2
: quando False, permite trabalhar com arquivos Zip criados antes de 01/01/1980 ou após 31/12/2107.strict_timestamps
: define a codificação de metadados (como comentários) no arquivo Zip.metadata_encoding
Principais Métodos da Classe ZipFile
: fecha o arquivo Zip.close()
: retorna informações sobre um arquivo no Zip como um objeto ZipInfo.getinfo()
: retorna uma lista com os nomes dos arquivos no Zip.namelist()
: retorna informações sobre todos os arquivos no Zip como uma lista de objetos ZipInfo.infolist()
: abre um arquivo específico no Zip.open()
: lê o conteúdo de um arquivo no Zip em bytes.read()
: extrai um arquivo do Zip.extract()
: extrai todos os arquivos do Zip.extractall()
: define uma senha para o arquivo Zip.setpassword()
: exibe o conteúdo do Zip no console.printdir()
Criando um Arquivo Zip
Para criar um arquivo Zip, utilize o modo "w"
"a"
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
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"
"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()
from zipfile import ZipFile
with ZipFile("programicio.zip", "a") as myzip:
print(myzip.infolist())
A classe ZipInfo
: nome do arquivo.filename
: data e hora da última modificação.date_time
: tipo de compressão.compress_type
: tamanho após compressão.compress_size
: tamanho original.file_size
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()
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()
from zipfile import ZipFile
with ZipFile("programicio.zip", "r") as myzip:
content = myzip.read("hello.txt")
print(content.decode("utf-8"))