2012-02-24 11 views
47

Este es el código que estoy usando actualmente para extraer un archivo comprimido que vive en el mismo directorio de trabajo actual que el script. ¿Cómo puedo especificar un directorio diferente para extraer?Extracción del contenido del archivo comprimido a un directorio específico en Python 2.7

El código que probé no está extrayéndolo donde quiero.

import zipfile 

fh = open('test.zip', 'rb') 
z = zipfile.ZipFile(fh) 
for name in z.namelist(): 
    outfile = open(name, 'wb') 
    outfile.write('C:\\'+z.read(name)) 
    outfile.close() 
fh.close() 
+1

¿Debería mover 'C: \\' + a la llamada abierta en lugar de escribir? –

Respuesta

96

Creo que sólo tiene una confusión aquí. Debe probablemente será similar a la siguiente:

import zipfile 

fh = open('test.zip', 'rb') 
z = zipfile.ZipFile(fh) 
for name in z.namelist(): 
    outpath = "C:\\" 
    z.extract(name, outpath) 
fh.close() 

y si lo que desea es extraer todos los archivos:

import zipfile 

with zipfile.ZipFile('test.zip', "r") as z: 
    z.extractall("C:\\") 
+0

ZipFile no tiene el atributo '__exit__', así que no sé cómo funcionaría su sentencia with as. – adam

+0

Si crea una instancia de 'ZipFile', sí tiene un método' __exit__'. Acabo de darle al ejemplo otra oportunidad (Python 2.7) y funciona como está escrito. – secretmike

+0

Python 2.6 tiene una implementación diferente de ZipFile por alguna razón. – adam

2

Peter de Rivaz tiene un punto en el comentario anterior. Querrá tener el directorio en la llamada para abrir(). Usted va a querer hacer algo como esto:

import zipfile 
import os 

os.mkdir('outdir') 
fh = open('test.zip','rb') 
z = zipfile.ZipFile(fh) 
for name in z.namelist(): 
    outfile = open('outdir'+'/'+name, 'wb') 
    outfile.write() 
    outfile.close() 
fh.close() 
10

Yo probé las otras respuestas en este tema, pero la solución final para mí era simplemente :

zfile = zipfile.ZipFile('filename.zip') 
zfile.extractall(optional_target_folder) 

Mira extractall, sino que lo utiliza sólo con archivos zip de confianza.

+2

Sugiero llamar 'zfile.close()', también, como dice en [ZipFile.close] (https://docs.python.org/2/library/zipfile.html#zipfile .ZipFile.close) que ** Debe llamar a close() antes de salir de su programa o no se escribirán los registros esenciales. **. – erwaman

0

he modificado el código para pedir al usuario de entrada el nombre de archivo y su ruta en la que necesita ser extraído y para que el usuario will've más control sobre dónde colocar la carpeta extraída y qué nombre debe asignarse a la carpeta extraída.

import zipfile 

#picking zip file from the directory 
ZipFileName = raw_input("Enter full path to zip file:") 
fh = open(ZipFileName , 'rb') 
z = zipfile.ZipFile(fh) 

#assigning a name to the extracted zip folder 
DestZipFolderName = raw_input("Assign destination folder a name: ") 
DestPathName = raw_input("Enter destination directory: ") 
DestPath = DestPathName + "\\" + DestZipFolderName 

for name in z.namelist(): 
    outpath = DestPath 
    z.extract(name, outpath) 
fh.close() 
4

Agregando a la respuesta de secretmike anterior con soporte para python 2.6 para extraer todos los archivos.

import zipfile 
import contextlib 


with contextlib.closing(zipfile.ZipFile('test.zip', "r")) as z: 
    z.extractall("C:\\") 
3

Si lo que desea extraer un archivo zip de la línea de comandos usando Python (por ejemplo, porque no tiene el comando de descompresión disponible), entonces se puede llamar al módulo de archivo zip directamente

python -m zipfile -e monty.zip target-dir/ 

Eche un vistazo al docs. También admite la compresión y la enumeración de los contenidos.

Cuestiones relacionadas