2012-02-24 10 views
47

Questo è il codice attualmente in uso per estrarre un file zip che risiede nella stessa directory di lavoro corrente dello script. Come posso specificare una directory diversa da cui estrarre?Estrazione del contenuto del file zip in una directory specifica in Python 2.7

Il codice che ho provato non lo estrae dove voglio.

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

Se si sposta il 'C: \\' + alla chiamata aperta anziché la chiamata di scrittura? –

risposta

96

Penso che tu hai appena avuto un disguido qui. Dovrebbe probabilmente qualcosa di simile al seguente:

import zipfile 

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

e se si desidera solo per estrarre tutti i file:

import zipfile 

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

ZipFile non ha attributo '__exit__', quindi non so come funzionerà la tua dichiarazione con. – adam

+0

Se si crea un'istanza 'ZipFile', ha un metodo' __exit__'. Ho appena dato un altro tentativo all'esempio (python 2.7) e funziona come scritto. – secretmike

+0

Python 2.6 ha un'implementazione diversa di ZipFile per qualche motivo. – adam

2

Peter de Rivaz ha un punto nel commento sopra. Volete avere la directory nella chiamata da aprire(). Avete intenzione di voler fare qualcosa di simile:

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

ho provato gli altri risposte in questo thread, ma la soluzione finale per me era semplicemente :

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

Guardate extractall, ma utilizzarlo solo con file zip affidabili.

+2

Suggerisco di chiamare 'zfile.close()', come dice in [ZipFile.close] (https://docs.python.org/2/library/zipfile.html#zipfile .ZipFile.close) che ** Devi chiamare close() prima di uscire dal tuo programma o i record essenziali non saranno scritti. **. – erwaman

0

ho modificato il codice per chiedere all'utente di ingresso il nome del file e il suo percorso in cui si ha bisogno di essere estratto e così l'utente will've un maggiore controllo su dove mettere la cartella estratta e quale nome dovrebbe essere assegnato alla cartella estratta.

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

Aggiunta alla risposta di secretmike sopra con supporto per python 2.6 per l'estrazione di tutti i file.

import zipfile 
import contextlib 


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

Se si desidera solo per estrarre un file zip dalla riga di comando utilizzando Python (ad esempio perché non si ha il comando unzip disponibili), quindi è possibile chiamare il modulo zipfile direttamente

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

Dai uno sguardo allo docs. Supporta anche la compressione e l'elenco dei contenuti.

Problemi correlati