Descomprimir archivos en Python

Respuestas:

787
import zipfile
with zipfile.ZipFile(path_to_zip_file, 'r') as zip_ref:
    zip_ref.extractall(directory_to_extract_to)

¡Eso es practicamente todo!

Rahul
fuente
77
¿Qué sucede si el contenido del archivo .zip es el mismo en todos los archivos .zip? ¿Cómo cambiar el nombre del contenido antes de extraerlo? ejemplo: 1.zip 2.zip .. todos contienen content.txt: ¿extraer todo como 1content.txt 2content.txt?
iratzhash
8
@iratzhash Normalmente creo un nuevo directorio temporal para los contenidos usando tempfile: docs.python.org/3/library/tempfile.html Descomprimo el directorio temporal y muevo / organizo los archivos desde allí.
Dave Forgac
8
@ 3kstc lo haría from zipfile import ZipFile. Al usarlo, ya no necesita usar zipfile.ZipFile, y puede usar ZipFile(zip_file_name).
Debug255
@iratzhash Me doy cuenta de que comentaste hace 1,5 años. Pero para que otros lo sepan, generalmente los contenidos dentro de un archivo zip son de solo lectura. Una buena respuesta está aquí por "bouke"
Debug255
Es una especie de meta nota, pero la edición de noviembre de 2018 hace que esto sea prácticamente idéntico a otra respuesta que ya usaba el administrador de contexto (y enlaces a lo que eso significa).
Engineero
304

Si está utilizando Python 3.2 o posterior:

import zipfile
with zipfile.ZipFile("file.zip","r") as zip_ref:
    zip_ref.extractall("targetdir")

No necesita usar el cierre o try / catch con esto ya que usa la construcción del administrador de contexto .

usuario1741137
fuente
18
ZipFile también funciona como administrador de contexto en 2.7 o posterior: docs.python.org/2/library/zipfile.html#zipfile.ZipFile
FelixEnescu
¿Cómo lidiar con la excepción docs.python.org/3.6/library/zipfile.html#zipfile.BadZipFile ? En general, ¿cuál es la mejor práctica para usar try / except con context manager (con declaración)?
SnowOnion
1
zipfile+ pathlib= ganar. ¿te importa si actualizo ligeramente tu respuesta?
Datanovice
38

Use el extractallmétodo, si está usando Python 2.6+

zip = ZipFile('file.zip')
zip.extractall()
Dan Breen
fuente
¿No tiene que especificar un destino (zip.extractall (destino))?
asonnenschein
3
No si solo estás extrayendo en el mismo directorio que el archivo zip
Dan Gayle
10
@DanGayle parece que esto está extrayendo el archivo zip en el directorio de trabajo actual, NO la ubicación del archivo zip
Brian Leishman
44
para mí, ZipFile () no funcionó pero zipfile.ZipFile () sí, después de importar zipfile
Agile Bean el
6

También puede importar solo ZipFile:

from zipfile import ZipFile
zf = ZipFile('path_to_file/file.zip', 'r')
zf.extractall('path_to_extract_folder')
zf.close()

Funciona en Python 2 y Python 3 .

simhumileco
fuente
1
Gracias por su atención @MylesHollowed Sin embargo, esta no es una copia de la respuesta aceptada. Estoy de acuerdo en que son similares entre sí, pero son diferentes. Esto también lo indica su comentario, porque el aceptado es definitivamente mejor para usted que el mío. Si fuera una copia, sería lo mismo ... Para alguien, mi respuesta puede ser valiosa porque tal vez sea más legible y, como notaron, importar menos código ... Es por estas diferencias que decidí poner mi respuesta para dar una alternativa ¿No es por eso que podemos poner otras respuestas después de aceptar una? Todo lo mejor
simhumileco
¿Qué hay de malo con esta respuesta? ¿Por qué alguien le dio un punto negativo? Después de todo, es la respuesta a la pregunta y se distingue por su simplicidad en comparación con otras respuestas, lo que puede ser importante para algunas personas que buscan una respuesta. ¿No es así?
simhumileco
1
@MylesHollowed import zipfile.ZipFilegenera ModuleNotFoundError: No module named 'zipfile.ZipFile'; 'zipfile' is not a packageen 3.6.5. Estoy abierto a que sea un error del operador de mi parte, pero no sé qué es.
MikeF
6

prueba esto :


import zipfile
def un_zipFiles(path):
    files=os.listdir(path)
    for file in files:
        if file.endswith('.zip'):
            filePath=path+'/'+file
            zip_file = zipfile.ZipFile(filePath)
            for names in zip_file.namelist():
                zip_file.extract(names,path)
            zip_file.close() 

ruta: descomprimir la ruta del archivo

Done Jin
fuente
3
import os 
zip_file_path = "C:\AA\BB"
file_list = os.listdir(path)
abs_path = []
for a in file_list:
    x = zip_file_path+'\\'+a
    print x
    abs_path.append(x)
for f in abs_path:
    zip=zipfile.ZipFile(f)
    zip.extractall(zip_file_path)

Esto no contiene validación para el archivo si no es zip. Si la carpeta contiene un archivo que no es .zip, fallará.

usuario3911901
fuente