O módulo zipfile da biblioteca estándar de Python pódese usar para comprimir ficheiros en ZIP e descomprimir ficheiros ZIP. Está incluído na biblioteca estándar, polo que non se precisa instalación adicional.
Explícanse os seguintes contidos.
- Comprime varios ficheiros nun ficheiro ZIP
- Engade un ficheiro novo a un ficheiro ZIP existente
- Comprime un directorio (cartafol) nun ficheiro ZIP
- Comprimido nun ficheiro ZIP cun contrasinal
- Comprobe o contido do ficheiro ZIP.
- Extrae (descomprime) o contido completo do ficheiro ZIP.
- Seleccione o contido do ficheiro ZIP e extráeo.
- Comprime varios ficheiros nun ficheiro ZIP
- Engade un ficheiro novo a un ficheiro ZIP existente
- Comprime un directorio (cartafol) nun ficheiro ZIP
- Comprimido nun ficheiro ZIP cun contrasinal
- Comprobe o contido do ficheiro ZIP.
- Extrae (descomprime) o contido completo do ficheiro ZIP.
- Seleccione o contido do ficheiro ZIP e extráeo.
Comprime varios ficheiros nun ficheiro ZIP
Cree un obxecto ZipFile e use o método write() para engadir os ficheiros que quere comprimir.
Para crear un ficheiro ZIP novo, especifique a ruta do ficheiro ZIP que se vai crear como primeiro argumento do construtor do obxecto ZipFile e o segundo argumento como seguew'
Ademais, o método de compresión pódese especificar como terceiro argumento.
zipfile.ZIP_STORED
:Simplemente combine varios ficheiros sen compresión (predeterminado)zipfile.ZIP_DEFLATED
:Compresión ZIP normal (requírese o módulo zlib)zipfile.ZIP_BZIP2
:Compresión BZIP2 (requírese o módulo bz2)zipfile.ZIP_LZMA
:Compresión LZMA (requírese módulo lzma)
BZIP2 e LZMA teñen unha relación de compresión máis alta (pódese comprimir a un tamaño máis pequeno), pero o tempo necesario para a compresión é máis longo.
No método write(), o ficheiro co primeiro argumento nome do ficheiro escríbese nun ficheiro ZIP co segundo argumento nome do ficheiro. Se se omite arcname, o nome do ficheiro úsase tal cal. arcname tamén pode especificar unha estrutura de directorios.
O obxecto ZipFile debe pecharse co método close(), pero se usa a instrución with, pecharase automaticamente cando remate o bloque.
import zipfile
with zipfile.ZipFile('data/temp/new_comp.zip', 'w', compression=zipfile.ZIP_DEFLATED) as new_zip:
new_zip.write('data/temp/test1.txt', arcname='test1.txt')
new_zip.write('data/temp/test2.txt', arcname='zipdir/test2.txt')
new_zip.write('data/temp/test3.txt', arcname='zipdir/sub_dir/test3.txt')
Ao especificar o argumento compress_type do método write(), tamén é posible seleccionar o método de compresión para cada ficheiro.
with zipfile.ZipFile('data/temp/new_comp_single.zip', 'w') as new_zip:
new_zip.write('data/temp/test1.txt', arcname='test1.txt', compress_type=zipfile.ZIP_DEFLATED)
new_zip.write('data/temp/test2.txt', arcname='zipdir/test2.txt')
new_zip.write('data/temp/test3.txt', arcname='zipdir/sub_dir/test3.txt')
Engade un ficheiro novo a un ficheiro ZIP existente
Para engadir un ficheiro novo a un ficheiro zip existente, estableza o primeiro argumento do construtor na ruta do ficheiro zip existente ao crear o obxecto ZipFile. Ademais, configure o segundo modo de argumento do seguinte xeito.a'
Entón, como no exemplo anterior, só tes que engadir o ficheiro usando o método write().
with zipfile.ZipFile('data/temp/new_comp.zip', 'a') as existing_zip:
existing_zip.write('data/temp/test4.txt', arcname='test4.txt')
Comprime un directorio (cartafol) nun ficheiro ZIP
Se queres comprimir un directorio completo (cartafol) nun único ficheiro ZIP, podes usar os.scandir() ou os.listdir() para facer unha lista de ficheiros, pero é máis fácil usar make_archive() no shutil. módulo.
Consulta o seguinte artigo.
- Artigos relacionados:Comprimir un directorio (cartafol) para zip ou tar en Python
Comprimido nun ficheiro ZIP cun contrasinal
O módulo zipfile non che permite crear ZIP protexidos con contrasinal. Se queres comprimir un ficheiro nun ficheiro zip protexido por contrasinal, utiliza a biblioteca de terceiros pyminizip.
Teña en conta que a descompresión dos ZIP protexidos con contrasinal pódese facer co módulo zipfile (consulte a continuación).
Comprobe o contido do ficheiro ZIP.
Podes comprobar o contido dun ficheiro ZIP existente.
Cree un obxecto ZipFile configurando o primeiro ficheiro de argumentos no construtor na ruta do ficheiro zip existente e o segundo modo de argumento en “r”. O argumento mode pódese omitir xa que o valor predeterminado é ‘r’.
Podes usar o método namelist() do obxecto ZipFile para obter unha lista de ficheiros arquivados.
with zipfile.ZipFile('data/temp/new_comp.zip') as existing_zip:
print(existing_zip.namelist())
# ['test1.txt', 'zipdir/test2.txt', 'zipdir/sub_dir/test3.txt', 'test4.txt']
Extrae (descomprime) o contido completo do ficheiro ZIP.
Para desempaquetar o contido dun ficheiro ZIP, cree un obxecto ZipFile co primeiro ficheiro de argumentos no construtor como camiño ao ficheiro ZIP existente e o segundo modo de argumento como “r”, como no exemplo anterior. O argumento mode pódese omitir xa que o valor predeterminado é ‘r’.
O método extractall() do obxecto ZipFile extrae (descomprime) todo o contido do ficheiro ZIP. O primeiro argumento, ruta, especifica a ruta do directorio para extraer. Se se omite, os ficheiros extraeranse ao directorio actual.
with zipfile.ZipFile('data/temp/new_comp.zip') as existing_zip:
existing_zip.extractall('data/temp/ext')
Pódese extraer un ficheiro ZIP cun contrasinal especificando o contrasinal como argumento pwd do método extractall().
with zipfile.ZipFile('data/temp/new_comp_with_pass.zip') as pass_zip:
pass_zip.extractall('data/temp/ext_pass', pwd='password')
Seleccione o contido do ficheiro ZIP e extráeo.
Se quere desempaquetar e extraer só determinados ficheiros, use o método extract().
O primeiro argumento do método extract() é o nome do ficheiro que se quere extraer e a ruta do segundo argumento é o camiño do directorio ao que se extrae. Se se omite o argumento camiño, o ficheiro extraerase ao directorio actual. O nome do ficheiro que se vai extraer debe incluír a ruta do directorio no ficheiro ZIP se está almacenado alí.
with zipfile.ZipFile('data/temp/new_comp.zip') as existing_zip:
existing_zip.extract('test1.txt', 'data/temp/ext2')
Do mesmo xeito que o método extractall(), o método extract() tamén che permite especificar un contrasinal como argumento pwd.
with zipfile.ZipFile('data/temp/new_comp_with_pass.zip') as pass_zip:
pass_zip.extract('test1.txt', 'data/temp/ext_pass2', pwd='password')