En esta entrada voy a explicar cómo manejar un archivo zip utilizando la biblioteca estándar de python
Crear un nuevo archivo Zip
Para crear un nuevo archivo, hay que usar una instancia de ZipFile en modo de escritura "w" y para agregar archivos, use el método write().
De forma predeterminada, el contenido del archivo zip no está comprimido (Zipfile.ZIP_STORED). Para añadir compresión, se requiere usar el módulo zlib.
import zipfile try: import zlib compression = zipfile.ZIP_DEFLATED except: compression = zipfile.ZIP_STORED zf = zipfile.ZipFile("example.zip", mode="w") try: zf.write("test.txt", compress_type=compression) finally: zf.close()
Obtener la información del archivo zip
Comprobar si es un archivo zip válido
La función `` is_zipfile () `` devuelve un valor booleano (verdadero o falso) que indica si el archivo es un archivo ZIP válido (basado en su número magico ).
#!/usr/bin/env python import zipfile zipfilename = ["example.zip", "example2.txt", "example3.zip"] for filename in zipfilename: print(str(filename) + " " + str(zipfile.is_zipfile(filename)))
Si ejecutas el script obtienes:
example.zip True example2.txt False example3.zip True
Si el archivo no existe (o no es valido), is_zipfile() devuelve como respuesta False.
Leer los nombres de los archivos en un archivo ZIP
Para leer los nombres de los archivos que estan dentro de un archivo zip existente, hay que usar namelist() de esta manera:
#!/usr/bin/env python import zipfile zf = zipfile.ZipFile("example.zip", "r") print(zf.namelist) zf.close()
El valor devuelto es una lista con los nombres del contenido del archivo zip:
['test.txt']
Lectura de los metadatos de un archivo ZIP
Para acceder a todos los metadatos sobre el contenido ZIP, utilice el comando infolist() y el método getinfo(), por ejemplo.
#!/usr/bin/env python import datetime import zipfile zf = zipfile.ZipFile("example.zip", "r") for info in zf.infolist(): print(info.filename) print(" Comment: " + str(info.comment)) print(" Modified: " + str(datetime.datetime(*info.date_time))) print(" System: " + str(info.create_system) + " (0=MS-DOS OS-2, 3=Unix)") print(" ZIP version: " + str(info.create_version)) print(" Compressed: " + str(info.compress_size) + " bytes") print(" Uncompressed: " + str(info.file_size) + " bytes") zf.close()
Que regresa la information de todos los archivos del zip:
test.txt Comment: Modified: 2016-09-20 23:08:46 System: 3 (0=MS-DOS OS-2, 3=Unix) ZIP version: 63 Compressed: 548 bytes Uncompressed: 1278 bytes
Hay campos adicionales distintos de los mostrados aquí, pero para poder descifrar esos valores en cualquier cosa útil se requiere una cuidadosa lectura de la Especificación de los archivos ZIP.
Extraer archivos de un ZIP
Para descomprimir un archivo simplemente hay que hacer lo siguiente:
#!/usr/bin/env python import zipfile zipfilename = "example.zip" password = None # open and extract all files in the zip z = zipfile.ZipFile(zipfilename, "r") try: z.extractall(pwd=password) except: print('Error') pass zf.close()
Notas y Limitaciones:
- El módulo zipfile no admite archivos ZIP con comentarios agregados, o archivos ZIP multi-disco. Pero soporta archivos ZIP de más de 4 GB que utilizan las extensiones ZIP64.
- Zipfile sólo soporta el método tradicional de cifrado PKWARE, si se intenta un cifrado de WinZip AES-256, al usar zipfile.extractall resulta en un RuntimeError "Bad password for file" aun cuando se ingrese la contraseña correcta.