zipfile — Trabalha com arquivos ZIP

Código-fonte: Lib/zipfile.py


O formato de arquivo ZIP é um padrão de compactação e arquivamento. Este módulo fornece ferramentas para criar, ler, escrever, adicionar, e listar um arquivo ZIP. Qualquer uso avançado deste módulo vai exigir um entendimento do formato, como definido em PKZIP Application Note.

Esse módulo atualmente não suporta arquivos ZIP multi-disco. Ele pode manipular arquivos ZIP que usam as extensões ZIP64 (ou seja arquivos ZIP com tamanho maior do que 4 Gb). Ele suporta descriptografia de arquivos criptografados dentro do ZIP, mas atualmente não pode criar um arquivo criptografado. A descriptografia é extremamente lenta pois é implementada em Python nativo ao invés de C.

Este módulo define os seguintes itens:

exception zipfile.BadZipFile

Este erro é levantado para arquivos ZIP corrompidos.

Novo na versão 3.2.

exception zipfile.BadZipfile

Alias para BadZipFile, para compatibilidade com versões mais antigas de Python.

Obsoleto desde a versão 3.2.

exception zipfile.LargeZipFile

Este erro é levantado quando um arquivo ZIP precisa da funcionalidade ZIP64 que não está habilitada.

class zipfile.ZipFile

A classe para ler e escrever arquivos ZIP. Veja a seção Objetos ZipFile para detalhes do construtor.

class zipfile.Path

Um wrapper compatível com pathlib para arquivos zip. Veja a seção Path Objects para detalhes.

Novo na versão 3.8.

class zipfile.PyZipFile

Classe para criar arquivos ZIP contendo bibliotecas Python.

class zipfile.ZipInfo(filename='NoName', date_time=(1980, 1, 1, 0, 0, 0))

Classe usada para representar informação sobre um membro de um archive. Instâncias desta classe são retornadas pelos métodos getinfo() e infolist() de objetos da classe ZipFile. A maioria dos usuários do módulo zipfile não vai precisar criar, mas apenas usar objetos criados pelo módulo. filename deveria ser o caminho completo do membro do arquivo, e date_time deveria ser uma tupla contendo seis campos que descrevem o momento da última modificação no arquivo; os campos são descritos na seção Objetos ZipInfo.

zipfile.is_zipfile(filename)

Retorna True se filename é um arquivo ZIP válido baseado no seu magic number, caso contrário retorna False. filename pode ser um arquivo ou um objeto arquivo ou similar também.

Alterado na versão 3.1: Suporte para arquivo e objetos arquivo ou similares.

zipfile.ZIP_STORED

Código numérico para um membro de um arquivo descompactado

zipfile.ZIP_DEFLATED

Código numérico para o método de compactação usual. Requer o módulo zlib .

zipfile.ZIP_BZIP2

Código numérico para o método de compactação BZIP2. Requer o módulo bz2.

Novo na versão 3.3.

zipfile.ZIP_LZMA

Código numérico para o método de compactação LZMA. Requer o módulo lzma.

Novo na versão 3.3.

Nota

A especificação do formato ZIP incluiu suporte para compactação bzip2 desde 2001, e para compactação LZMA desde 2006. Porém, algumas ferramentas (incluindo versões mais antigas de Python) não suportam esses métodos de compactação, e podem recusar processar o arquivo ZIP como um todo, ou falhar em extrair arquivos individuais.

Ver também

PKZIP Notas da Aplicação

Documentação do formato de arquivo ZIP feita por Phil Katz, criador do formato e dos algoritmos usados.

Info-ZIP Home Page

Informações sobre o programas de arquivamento e desenvolvimento de bibliotecas do projeto Info-ZIP.

Objetos ZipFile

class zipfile.ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, compresslevel=None, *, strict_timestamps=True)

Abre um arquivo ZIP, onde file pode ser um caminho para um arquivo (uma string), um objeto arquivo ou similar, ou um objeto caminho ou similar.

O parâmetro mode deve ser 'r' para ler um arquivo existente, 'w' para truncar e gravar um novo arquivo, 'a' para adicionar a um arquivo existente, ou 'x' exclusivamente para criar e gravar um novo arquivo. Se o mode é 'x' e file se refere a um arquivo existente, um FileExistsError vai ser levantado. Se o mode é 'a' e file se refere a um arquivo ZIP existente, então arquivos adicionais são adicionados ao mesmo. Se file não se refere a um arquivo ZIP, então um novo arquivo ZIP é adicionado ao arquivo. Isso diz respeito a adicionar um arquivo ZIP a um outro arquivo (como por exemplo python.exe). Se o mode é 'a' e o arquivo não existe, ele será criado. Se o mode é 'r' ou 'a', o arquivo deve ser percorrível.

compression é o método de compactação ZIP para usar ao escrever o arquivo, e deve ser ZIP_STORED, ZIP_DEFLATED, ZIP_BZIP2 ou ZIP_LZMA; valores desconhecidos devem causar o levantamento de NotImplementedError. Se ZIP_DEFLATED, ZIP_BZIP2 ou ZIP_LZMA for especificado mas o módulo correspondente (zlib, bz2 ou lzma) não estiver disponível, é levado um RuntimeError. O valor padrão é ZIP_STORED.

Se allowZip64 é True (valor padrão), então zipfile vai criar arquivos ZIP que usem as extensões ZIP64 quando o arquivo ZIP é maior do que 4 GiB. Se é false, zipfile levanta uma exceção quando o arquivo ZIP precisaria das extensões ZIP64.

O parâmetro compresslevel controla o nível de compactação para usar ao gravar no arquivo ZIP. Quando usado ZIP_STORED ou ZIP_LZMA não tem efeito. Quando usado ZIP_DEFLATED inteiros de 0 a 9 são aceitos (veja zlib para mais informações). Quando usado ZIP_BZIP2 inteiros de 1 a 9 são aceitos (veja bz2 para mais informações).

O argumento strict_timestamps, quando definido como False, permite compactar arquivos anteriores a 1980-01-01 com o custo de definir o carimbo de data/hora para 1980-01-01. Comportamento semelhante ocorre com arquivos mais recentes que 2107-12-31, o carimbo de data/hora também é definido como o limite.

Se o arquivo é criado com modo 'w', 'x' ou 'a' e então closed() sem adicionar nada ao arquivo, a estrutura própria para um arquivo vazio será escrita no arquivo.

ZipFile também é um gerenciador de contexto e portanto suporta a instrução with. Neste exemplo, myzip é fechado ao final da execução da instrução with – mesmo que ocorra uma exceção:

with ZipFile('spam.zip', 'w') as myzip:
    myzip.write('eggs.txt')

Novo na versão 3.2: Adicionado o uso de ZipFile como um gerenciador de contexto.

Alterado na versão 3.3: Adicionado suporte para compactação bzip2 e lzma.

Alterado na versão 3.4: Extensões ZIP64 são habilitadas por padrão.

Alterado na versão 3.5: Adicionado suporte para escrever em streams não percorríveis. Adicionado suporte ao modo 'x'.

Alterado na versão 3.6: Anteriormente, um simples RuntimeError era levantado para valores de compactação desconhecidos.

Alterado na versão 3.6.2: O parâmetro file aceita um objeto caminho ou similar.

Alterado na versão 3.7: Adicionado o parâmetro compresslevel.

Novo na versão 3.8: The strict_timestamps keyword-only argument

ZipFile.close()

Fecha o arquivo. Você deve chamar close() antes de sair do seu programa ou registros essenciais não serão gravados.

ZipFile.getinfo(name)

Retorna um objeto ZipInfo com informações sobre o name do membro do arquivo. Chamar getinfo() para um nome não encontrado no arquivo levanta um KeyError.

ZipFile.infolist()

Retorna uma lista contendo um objeto ZipInfo para cada membro do arquivo. Os objetos estão na mesma ordem das entradas no arquivo ZIP em disco se um arquivo existente foi aberto.

ZipFile.namelist()

Retorna uma lista de membros do arquivo por nome.

ZipFile.open(name, mode='r', pwd=None, *, force_zip64=False)

Acessa um membro do arquivo como um objeto arquivo binário ou similar. name pode ser o nome de um arquivo membro ou um objeto ZipInfo. O parâmetro mode, se informado, deve ser 'r' (valor padrão) ou 'w'. pwd é a senha usada para descriptografar arquivos ZIP criptografados.

open() também é um gerenciador de contexto e, portanto, suporta a instrução with:

with ZipFile('spam.zip') as myzip:
    with myzip.open('eggs.txt') as myfile:
        print(myfile.read())

Com mode 'r' o objeto arquivo ou similar (ZipExtFile) é somente para leitura e fornece os seguintes métodos: read(), readline(), readlines(), seek(), tell(), __iter__(), __next__(). Esses objetos podem operar independentemente do ZipFile.

Com mode='w', é retornado um manipulador de arquivo, que suporta o método write(). Quando um manipulador de arquivo modificável é aberto, tentativas de ler ou gravar outros arquivos no arquivo ZIP levanta um ValueError.

Ao gravar um arquivo, se o tamanho do arquivo não é conhecido mas pode exceder 2 Gb, passe force_zip64=True para assegurar que o formato do header é capaz de suportar arquivos grandes. Se o tamanho do arquivo é conhecido, construa um objeto ZipInfo com file_size informado, então use-o como parâmetro name.

Nota

Os métodos open(), read() e extract() podem receber um nome de arquivo ou um objeto ZipInfo. Você vai gostar disso quando tentar ler um arquivo ZIP que contém membros com nomes duplicados.

Alterado na versão 3.6: Removido suporte ao mode='U'. Uso de io.TextIOWrapper para leitura de arquivos texto compactados em modo de novas linhas universais.

Alterado na versão 3.6: open() agora pode ser usado para gravar arquivos com a opção mode='w'.

Alterado na versão 3.6: Chama open() em um ZipFile fechado levanta um ValueError. Anteriormente, um RuntimeError era levantado.

ZipFile.extract(member, path=None, pwd=None)

Extrai um membro do arquivo para o diretório atual; member deve ser o nome completo ou um objeto ZipInfo. A informação do arquivo é extraída com maior precisão possível. path especifica um outro diretório em que deve ser gravado. member pode ser um nome de arquivo ou um objeto ZipInfo. pwd é a senha usada para criptografar arquivos.

Retorna o caminho normalizado criado (um diretório ou novo arquivo).

Nota

Se um nome de arquivo membro é um caminho absoluto, o drive/UNC e (contra)barras no início serão removidos, por exemplo: ///foo/bar se torna foo/bar no Unix, e C:\foo\bar vira foo\bar no Windows. E todos os componentes ".." no nome de um arquivo membro serão removidos, por exemplo: ../../foo../../ba..r vira foo../ba..r. No Windows caracteres ilegais (:, <, >, |, ", ?, and *) são substituídos por underscore (_).

Alterado na versão 3.6: Chama extract() em um ZipFile fechado levanto um ValueError. Anteriormente, um RuntimeError era levantado.

Alterado na versão 3.6.2: O parâmetro path aceita um objeto caminho ou similar.

ZipFile.extractall(path=None, members=None, pwd=None)

Extrai todos os membros de um arquivo para o diretório atual. path especifica um diretório diferente para gravar os arquivos extraídos. members é opcional e deve ser um sub-conjunto da lista retornada por namelist(). pwd é uma senha usada para criptografar arquivos.

Aviso

Nunca extrai arquivos de fontes não confiáveis sem inspeção prévia. É possível que os arquivos sejam criados fora do path, por exemplo membros que tem nomes absolutos de arquivos começando com "/" ou nomes com dois pontos "..". Este módulo tenta prevenir isto. Veja nota em extract().

Alterado na versão 3.6: Chama extractall() em um ZipFile fechado levanta um ValueError. Anteriormente, um RuntimeError era levantado.

Alterado na versão 3.6.2: O parâmetro path aceita um objeto caminho ou similar.

ZipFile.printdir()

Imprime a tabela de conteúdos de um arquivo para sys.stdout.

ZipFile.setpassword(pwd)

Define pwd como senha padrão para extrair arquivos criptografados.

ZipFile.read(name, pwd=None)

Retorna os bytes do arquivo name no arquivo compactado. name é o nome do arquivo no arquivo compactado, ou um objeto ZipInfo. O arquivo compactado deve estar aberto para leitura ou acréscimo. pwd é a senha usada para criptografar arquivos e, se especificada, vai sobrepor a senha padrão configurada com setpassword(). Chamar read() em um ZipFile que use um método de compactação diferente de ZIP_STORED, ZIP_DEFLATED, ZIP_BZIP2 ou ZIP_LZMA levanta um NotImplementedError. Um erro também é levanta se o módulo de compactação correspondente não está disponível.

Alterado na versão 3.6: Chama read() em um ZipFile fechado levanta um ValueError. Anteriormente, um RuntimeError era levantado.

ZipFile.testzip()

Lê todos os arquivos no arquivo compactado e verifica seus CRC’s e cabeçalhos de arquivo. Retorna o nome do primeiro arquivo corrompido, or então retorna None.

Alterado na versão 3.6: Chama testzip() em um ZipFile fechado levanta um ValueError. Anteriormente, um RuntimeError era levantado.

ZipFile.write(filename, arcname=None, compress_type=None, compresslevel=None)

Grava o arquivo chamado filename no arquivo compactado, dando ao arquivo compactado o nome arcname (por padrão, este é o mesmo de filename, mas sem a letra do drive e com separadores removidos do início do nome). Se informado, compress_type sobrescreve o valor dado ao parâmetro compression do construtor para a nova entrada. Da mesma forma, compresslevel vai sobrescrever o construtor se informado. O arquivo compactado deve ser aberto em modo 'w', 'x' ou 'a'.

Nota

Nomes de arquivo compactado devem ser relativos a raiz do mesmo, isto é, não devem começar com um separador de caminho.

Nota

Se arcname (ou filename, se arcname não for informado) contém um byte nulo, o nome do arquivo no arquivo compactado será truncado no byte nulo.

Nota

A leading slash in the filename may lead to the archive being impossible to open in some zip programs on Windows systems.

Alterado na versão 3.6: Chama write() em um ZipFile criado com modo 'r' ou em um ZipFile fechado levanta um ValueError. Anteriormente, um RuntimeError era levantado

ZipFile.writestr(zinfo_or_arcname, data, compress_type=None, compresslevel=None)

Grava um arquivo no arquivo compactado. O conteúdo é data, que pode ser uma instância de str ou de bytes; Se é uma str, ela é encodada como UTF-8 primeiro. zinfo_or_arcname é o nome que será dado ao arquivo no arquivo compactado, ou uma instância de ZipInfo. Se é uma instância, pelo menos o nome do arquivo, a data, e a hora devem ser informados. Se é um nome, a data e hora recebem a data e hora atual. O arquivo compactado deve ser aberto em modo 'w', 'x' ou 'a'.

Se informado, compress_type sobrescreve o valor do parâmetro compression do construtor para a nova entrada, ou no zinfo_or_arcname (se é uma instância de ZipInfo). Da mesma forma, compresslevel vai sobrescrever o construtor se informado.

Nota

Quando é passada uma instância de ZipInfo ou o parâmetro zinfo_or_arcname, o método de compactação usado será aquele especificado no compress_type da instância de ZipInfo. Por padrão, o construtor da classe ZipInfo seta este membro para ZIP_STORED.

Alterado na versão 3.2: O argumento compress_type.

Alterado na versão 3.6: Chama writestr() em um ZipFile criado com modo 'r' ou em um ZipFile fechado levanta um ValueError. Anteriormente, um RuntimeError era levantado.

Os seguintes atributos de dados também estão disponíveis:

ZipFile.filename

Nome do arquivo ZIP.

ZipFile.debug

O nível de saída de debug para usar. Pode ser setado de 0` (valor padrão, sem nenhuma saída) a 3 (com mais saída). A informação de debug é escrita em sys.stdout.

ZipFile.comment

The comment associated with the ZIP file as a bytes object. If assigning a comment to a ZipFile instance created with mode 'w', 'x' or 'a', it should be no longer than 65535 bytes. Comments longer than this will be truncated.

Path Objects

class zipfile.Path(root, at='')

Construct a Path object from a root zipfile (which may be a ZipFile instance or file suitable for passing to the ZipFile constructor).

at specifies the location of this Path within the zipfile, e.g. ‘dir/file.txt’, ‘dir/’, or ‘’. Defaults to the empty string, indicating the root.

Path objects expose the following features of pathlib.Path objects:

Path objects are traversable using the / operator.

Path.name

The final path component.

Path.open(mode='r', *, pwd, **)

Invoke ZipFile.open() on the current path. Allows opening for read or write, text or binary through supported modes: ‘r’, ‘w’, ‘rb’, ‘wb’. Positional and keyword arguments are passed through to io.TextIOWrapper when opened as text and ignored otherwise. pwd is the pwd parameter to ZipFile.open().

Alterado na versão 3.9: Added support for text and binary modes for open. Default mode is now text.

Path.iterdir()

Enumerate the children of the current directory.

Path.is_dir()

Return True if the current context references a directory.

Path.is_file()

Return True if the current context references a file.

Path.exists()

Return True if the current context references a file or directory in the zip file.

Path.read_text(*, **)

Read the current file as unicode text. Positional and keyword arguments are passed through to io.TextIOWrapper (except buffer, which is implied by the context).

Path.read_bytes()

Read the current file as bytes.

Objetos PyZipFile

The PyZipFile constructor takes the same parameters as the ZipFile constructor, and one additional parameter, optimize.

class zipfile.PyZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, optimize=-1)

Novo na versão 3.2: The optimize parameter.

Alterado na versão 3.4: Extensões ZIP64 são habilitadas por padrão.

Instances have one method in addition to those of ZipFile objects:

writepy(pathname, basename='', filterfunc=None)

Search for files *.py and add the corresponding file to the archive.

If the optimize parameter to PyZipFile was not given or -1, the corresponding file is a *.pyc file, compiling if necessary.

If the optimize parameter to PyZipFile was 0, 1 or 2, only files with that optimization level (see compile()) are added to the archive, compiling if necessary.

Se pathname for um arquivo, o nome do arquivo deverá terminar com .py, e apenas o arquivo (*.pyc correspondente) será adicionado no nível superior (sem informações do caminho). Se pathname for um arquivo que não termine com .py, um RuntimeError será levantado. Se for um diretório, e o diretório não for um diretório de pacotes, todos os arquivos *.pyc serão adicionados no nível superior. Se o diretório for um diretório de pacotes, todos *.pyc serão adicionados sob o nome do pacote como um caminho de arquivo e, se algum subdiretório for um diretório de pacotes, todos serão adicionados recursivamente na ordem de classificação.

basename is intended for internal use only.

filterfunc, if given, must be a function taking a single string argument. It will be passed each path (including each individual full file path) before it is added to the archive. If filterfunc returns a false value, the path will not be added, and if it is a directory its contents will be ignored. For example, if our test files are all either in test directories or start with the string test_, we can use a filterfunc to exclude them:

>>> zf = PyZipFile('myprog.zip')
>>> def notests(s):
...     fn = os.path.basename(s)
...     return (not (fn == 'test' or fn.startswith('test_')))
>>> zf.writepy('myprog', filterfunc=notests)

The writepy() method makes archives with file names like this:

string.pyc                   # Top level name
test/__init__.pyc            # Package directory
test/testall.pyc             # Module test.testall
test/bogus/__init__.pyc      # Subpackage directory
test/bogus/myfile.pyc        # Submodule test.bogus.myfile

Novo na versão 3.4: The filterfunc parameter.

Alterado na versão 3.6.2: The pathname parameter accepts a path-like object.

Alterado na versão 3.7: Recursion sorts directory entries.

Objetos ZipInfo

Instances of the ZipInfo class are returned by the getinfo() and infolist() methods of ZipFile objects. Each object stores information about a single member of the ZIP archive.

There is one classmethod to make a ZipInfo instance for a filesystem file:

classmethod ZipInfo.from_file(filename, arcname=None, *, strict_timestamps=True)

Construct a ZipInfo instance for a file on the filesystem, in preparation for adding it to a zip file.

filename should be the path to a file or directory on the filesystem.

If arcname is specified, it is used as the name within the archive. If arcname is not specified, the name will be the same as filename, but with any drive letter and leading path separators removed.

O argumento strict_timestamps, quando definido como False, permite compactar arquivos anteriores a 1980-01-01 com o custo de definir o carimbo de data/hora para 1980-01-01. Comportamento semelhante ocorre com arquivos mais recentes que 2107-12-31, o carimbo de data/hora também é definido como o limite.

Novo na versão 3.6.

Alterado na versão 3.6.2: The filename parameter accepts a path-like object.

Novo na versão 3.8: The strict_timestamps keyword-only argument

Instances have the following methods and attributes:

ZipInfo.is_dir()

Return True if this archive member is a directory.

This uses the entry’s name: directories should always end with /.

Novo na versão 3.6.

ZipInfo.filename

Name of the file in the archive.

ZipInfo.date_time

The time and date of the last modification to the archive member. This is a tuple of six values:

Índice

Valor

0

Year (>= 1980)

1

Month (one-based)

2

Day of month (one-based)

3

Hours (zero-based)

4

Minutos (base zero)

5

Seconds (zero-based)

Nota

The ZIP file format does not support timestamps before 1980.

ZipInfo.compress_type

Type of compression for the archive member.

ZipInfo.comment

Comment for the individual archive member as a bytes object.

ZipInfo.extra

Expansion field data. The PKZIP Application Note contains some comments on the internal structure of the data contained in this bytes object.

ZipInfo.create_system

System which created ZIP archive.

ZipInfo.create_version

PKZIP version which created ZIP archive.

ZipInfo.extract_version

PKZIP version needed to extract archive.

ZipInfo.reserved

Must be zero.

ZipInfo.flag_bits

ZIP flag bits.

ZipInfo.volume

Volume number of file header.

ZipInfo.internal_attr

Internal attributes.

ZipInfo.external_attr

External file attributes.

ZipInfo.header_offset

Byte offset to the file header.

ZipInfo.CRC

CRC-32 do arquivo não comprimido.

ZipInfo.compress_size

Size of the compressed data.

ZipInfo.file_size

Size of the uncompressed file.

Interface de Linha de Comando

The zipfile module provides a simple command-line interface to interact with ZIP archives.

If you want to create a new ZIP archive, specify its name after the -c option and then list the filename(s) that should be included:

$ python -m zipfile -c monty.zip spam.txt eggs.txt

Passing a directory is also acceptable:

$ python -m zipfile -c monty.zip life-of-brian_1979/

If you want to extract a ZIP archive into the specified directory, use the -e option:

$ python -m zipfile -e monty.zip target-dir/

For a list of the files in a ZIP archive, use the -l option:

$ python -m zipfile -l monty.zip

Opções de linha de comando

-l <zipfile>
--list <zipfile>

List files in a zipfile.

-c <zipfile> <source1> ... <sourceN>
--create <zipfile> <source1> ... <sourceN>

Create zipfile from source files.

-e <zipfile> <output_dir>
--extract <zipfile> <output_dir>

Extract zipfile into target directory.

-t <zipfile>
--test <zipfile>

Test whether the zipfile is valid or not.

Decompression pitfalls

The extraction in zipfile module might fail due to some pitfalls listed below.

From file itself

Decompression may fail due to incorrect password / CRC checksum / ZIP format or unsupported compression method / decryption.

File System limitations

Exceeding limitations on different file systems can cause decompression failed. Such as allowable characters in the directory entries, length of the file name, length of the pathname, size of a single file, and number of files, etc.

Limitações de recursos

The lack of memory or disk volume would lead to decompression failed. For example, decompression bombs (aka ZIP bomb) apply to zipfile library that can cause disk volume exhaustion.

Interruption

Interruption during the decompression, such as pressing control-C or killing the decompression process may result in incomplete decompression of the archive.

Default behaviors of extraction

Not knowing the default extraction behaviors can cause unexpected decompression results. For example, when extracting the same archive twice, it overwrites files without asking.