zipfile para comprimir e descomprimir ficheiros ZIP en Python

Negocios

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

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.

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')
Copied title and URL