O documento descreve como manipular arquivos ZIP em Python usando o módulo zipfile. É possível criar, ler, extrair arquivos e obter metadados de arquivos ZIP como nome, tamanho e data de modificação.
1. Criando e Abrindo Arquivos ZIP
Marcel Pinheiro Caraciolo
Python
Aula
Extra
1
2. Conhecendo o zipfile
Python
tem
suporte
para
abertura
e
escrita
de
arquivos
ZIP.
Através
do
módulo
zipfile
é
possível
comprimir,
adicionar,
ler
,
escrever
e
até
importar
módulos
a
par@r
de
um
arquivo
ZIP.
>>>
import
zipfile
>>>
zf
=
zipfile.ZipFile('example.zip',
'r’)
hKp://docs.python.org/library/zipfile.html
Python
Aula
Extra
2
3. Conhecendo o zipfile
Python
tem
suporte
para
abertura
e
escrita
de
arquivos
ZIP.
Através
do
módulo
zipfile
é
possível
comprimir,
adicionar,
ler
,
escrever
e
até
importar
módulos
a
par@r
de
um
arquivo
ZIP.
>>>
import
zipfile
>>>
zf
=
zipfile.ZipFile('example.zip',
'r’)
Simples
não
?!
hKp://docs.python.org/library/zipfile.html
Python
Aula
Extra
3
4. Abrir Arquivos Zip
Sempre
importante
verificarmos
se
o
arquivo
corrente
desejado
se
refere
ou
não
a
um
arquivo
ZIP
válido.
A
função
para
este
caso
é
o
is_zipfile(‘filename’).
>>>
import
zipfile
>>>
zipfile.is_zipfile(“README.txt”)
False
>>>zipfile.is_zipfile(“example.zip”)
True
O
que
ele
verifica
não
é
apenas
se
tem
a
terminação
.zip
e
sim
se
referencia
a
uma
estrutura
válida
de
arquivo
comprimido.
Python
Aula
Extra
4
5. Abrir Arquivos Zip
Para
ler
quais
os
nomes
de
arquivos
existentes
em
um
arquivo
zip,
use
a
função
namelist():
>>>
import
zipfile
>>>
zf
=
zipfile.ZipFile(‘example.zip’,
‘r’)
>>>
print
zf.namelist()
[“README.txt”]
Python
Aula
Extra
5
6. Abrir Arquivos Zip
Ele
pode
acessar
todos
os
meta-‐dados
de
um
arquivo
Zip,
por
meio
das
funções
infolist()
ou
ge0nfo().
import
date@me
import
zipfile
def
print_info(archive_name):
zf
=
zipfile.ZipFile(archive_name)
for
info
in
zf.infolist():
print
info.filename
print
'tComment:t',
info.comment
print
'tModified:t',
date@me.date@me(*info.date_@me)
print
'tSystem:tt',
info.create_system,
'(0
=
Windows,
3
=
Unix)'
print
'tZIP
version:t',
info.create_version
print
'tCompressed:t',
info.compress_size,
'bytes'
print
'tUncompressed:t',
info.file_size,
'bytes'
print
Python
Aula
Extra
6
7. Abrir Arquivos Zip
Ele
pode
acessar
todos
os
meta-‐dados
de
um
arquivo
Zip,
por
meio
das
funções
infolist()
ou
ge0nfo().
$
python
zipfile_infolist.py
README.txt
Comment:
Modified:
2007-‐12-‐16
10:08:52
System:
3
(0
=
Windows,
3
=
Unix)
ZIP
version:
23
Compressed:
63
bytes
Uncompressed:
75
bytes
Python
Aula
Extra
7
8. Abrir Arquivos Zip
Ele
pode
acessar
todos
os
meta-‐dados
de
um
arquivo
Zip,
por
meio
das
funções
infolist()
ou
ge0nfo().
import
date@me
import
zipfile
def
print_info(archive_name):
zf
=
zipfile.ZipFile(archive_name)
Existem
outras
informações
que
for
info
in
zf.infolist():
podem
ser
obdas
além
das
apresentadas.
Recomendo
a
print
info.filename
leitura
das
especificações
print
'tComment:t',
info.comment
PKZIP
Applicaon
Note.
print
'tModified:t',
date@me.date@me(*info.date_@me)
print
'tSystem:tt',
info.create_system,
'(0
=
Windows,
3
=
Unix)'
print
'tZIP
version:t',
info.create_version
print
'tCompressed:t',
info.compress_size,
'bytes'
print
'tUncompressed:t',
info.file_size,
'bytes'
print
Python
Aula
Extra
8
9. Abrir Arquivos Zip
Usando
o
ge0nfo()
no
caso
quando
você
já
sabe
o
nome
do
arquivo.
>>>
import
zipfile
>>>
zf
=
zipfile.ZipFile(‘example.zip’,
‘r’)
>>>
info
=
z.ge@nfo(“README.txt”)
>>>
info.filename,
info.file_size
README.txt
75
Python
Aula
Extra
9
10. Abrir Arquivos Zip
Usando
o
ge0nfo()
no
caso
quando
você
já
sabe
o
nome
do
arquivo.
>>>
import
zipfile
>>>
zf
=
zipfile.ZipFile(‘example.zip’,
‘r’)
S e
o
a r q u i v o
n ã o
f o r
encontrado
o
ge#nfo()
>>>
info
=
z.ge0nfo(“README.txt”)
retorna
uma
exceção
do
po
>>>
info.filename,
info.file_size
KeyError.
README.txt
75
Python
Aula
Extra
10
11. Extraindo arquivos de um Zip
Para
acessar
o
conteúdo
do
arquivo,
basta
u@lizar
o
método
read()
passando
como
parâmetro
o
nome
do
arquivo.
>>>
import
zipfile
>>>
zf
=
zipfile.ZipFile(‘example.zip’,
‘r’)
>>>
data
=
z.read(“README.txt”)
>>>
repr(data)
'The
examples
for
the
zipfile
module
use
this
file
and
example.zip
as
data.n'
Lembrando
que
o
conteúdo
lido
é
no
formato
de
string,
logo
se
for
arquivos
binários,
ele
retornará
uma
string
de
bytes!
Python
Aula
Extra
11
12. Extraindo arquivos de um Zip
Podemos
chamar
diretamente
também
o
extractall()
que
extrai
todos
os
arquivos
para
um
diretório
especificado.
>>>
import
zipfile
>>>
zf
=
zipfile.ZipFile(‘example.zip’,
‘r’)
>>>
zf.extractall()
>>>
f
=
open(‘README.txt’)
>>>
f.read()
'The
examples
for
the
zipfile
module
use
this
file
and
example.zip
as
data.n'
Você
pode
inclusive
alterar
o
caminho
pela
variável
path
e
tambem
definir
quais
serao
os
arquivos
extraidos
pela
variavel
lista
members.
Python
Aula
Extra
12
13. Criando novos arquivos Zip
Para
criar
um
novo
arquivo,
basta
instanciar
ZipFile
no
modo
escrita.
Para
adicionar
arquivos,
use
o
método
write()
>>>
import
zipfile
>>>
zf
=
zipfile.ZipFile(‘example.zip’,
‘w’)
>>>
zf.write(“README.txt”)
>>>
zf.close()
Python
Aula
Extra
13
14. Mas se eu quiser adicionar
compressão ?
O
Módulo
zlib
é
necessário.
Se
es@ver
disponível
você
pode
configurar
o
modo
de
compressão.
O
padrão
é
o
zpfile.ZIP_STORED
>>>
import
zipfile
>>>
import
zlib
>>>
zf
=
zipfile.ZipFile(‘example.zip’,
‘w’)
>>>
zf.write(“README.txt”
,
compress_type
=
zipfile.ZIP_DEFLATED)
>>>
zf.close()
Python
Aula
Extra
14
15. Mas se eu quiser adicionar
compressão ?
O
Módulo
zlib
é
necessário.
Se
es@ver
disponível
você
pode
configurar
o
modo
de
compressão.
O
padrão
é
o
zpfile.ZIP_STORED
>>>
import
zipfile
Se
déssemos
um
print
em
>>>
zf
=
zipfile.ZipFile(‘example.zip’,
‘w’)
genfo(‘README.txt’)
obteríamos:
>>>
zf.write(“README.txt”
,
compress_type
=
zipfile.ZIP_DEFLATED)
README.txt
>>>
zf.close()
Comment:
Modified:
2007-‐12-‐16
10:08:50
System:
3
(0
=
Windows,
3
=
Unix)
ZIP
version:
20
Compressed:
63
bytes
Uncompressed:
75
bytes
Python
Aula
Extra
15
16. Dicas interessantes
Se
quisermos
adicionar
um
arquivo
dentro
de
um
arquivo
zip
com
um
nome
diferente
do
nome
original
?
>>>
zf.write(‘README.txt’,
arcname
=
‘NOT_README.txt’)
Se
quisermos
escrever
dados
que
não
vem
de
um
arquivo.
Simplemente
escrevendo
string
de
bytes
em
um
arquivo
direto
?
Mensagem
em
string
>>>
zf.writestr(‘from_string.txt’,
‘vamos
adicionar
direto
de
uma
string’)
Python
Aula
Extra
16
17. Adicionando arquivos
Adicionar
novos
arquivos
a
um
arquivo
zip
existente
basta
abri-‐lo
no
modo
append
‘a’.
>>>
import
zipfile
>>>
zf
=
zipfile.ZipFile(‘example.zip’,
‘a’)
>>>
zf.write(“exercicio.py”)
>>>
zf.close()
Python
Aula
Extra
17
18. Importando módulos de um arquivo zip
Desde
a
versão
2.3,
Python
permite
importar
módulos
direto
de
um
arquivo
zip
desde
que
este
esteja
no
sys.path
.
Para
escrita
de
arquivos:
>>>
import
zipfile
>>>
zf
=
zipfile.PyZipFile(‘example.zip’,
mode=‘w’)
>>>
zf.writepy(“.”)
>>>
zf.close()
Python
Aula
Extra
18
19. Importando módulos de um arquivo zip
Desde
a
versão
2.3,
Python
permite
importar
módulos
direto
de
um
arquivo
zip
desde
que
este
esteja
no
sys.path
.
Para
escrita
de
arquivos:
>>>
import
zipfile
>>>
zf
=
zipfile.PyZipFile(‘example.zip’,
mode=‘w’)
Quando
chamamos
a
função
writepy(),
a
>>>
zf.writepy(“.”)
classe
PyZipFile
procura
no
diretório
passado
como
parâmetro
arquivos
.py
e
>>>
zf.close()
adiciona
os
arquivos
compilados
.pyo
ou
.pyc
dentro
do
arquivo
zip.
Se
estes
não
exisrem
um
.pyc
é
criado
e
adicionado.
Modo
debug>
zf.debug
=3
Python
Aula
Extra
19
20. Importando módulos de um arquivo zip
Desde
a
versão
2.3,
Python
permite
importar
módulos
direto
de
um
arquivo
zip
desde
que
este
esteja
no
sys.path
.
Para
leitura
de
arquivos:
>>>
import
sys
>>>
sys.path.insert(0,
‘example.zip’)
>>>
import
example
>>>
example.__file__
example.zip/example.pyc
Python
Aula
Extra
20
21. Criando e Abrindo Arquivos ZIP
Marcel Pinheiro Caraciolo
Python
Aula
Extra
21