2011-12-31 15 views
5

sto usando il codice corrente per estrarre i file da un file zip mantenendo la struttura di directory:file estratto da zip, senza mantenere la cartella di livello superiore con il pitone zipfile

zip_file = zipfile.ZipFile('archive.zip', 'r') 
zip_file.extractall('/dir/to/extract/files/') 
zip_file.close() 

Ecco una struttura per un esempio di file zip:

/dir1/file.jpg 
/dir1/file1.jpg 
/dir1/file2.jpg 

alla fine voglio questo:

/dir/to/extract/file.jpg 
/dir/to/extract/file1.jpg 
/dir/to/extract/file2.jpg 

Ma DEVO gnora solo se il file zip ha una cartella di livello superiore con tutti i file al suo interno, in modo che quando estraggo una zip con questa struttura:

/dir1/file.jpg 
/dir1/file1.jpg 
/dir1/file2.jpg 
/dir2/file.txt 
/file.mp3 

dovrebbe rimanere simile a questo:

/dir/to/extract/dir1/file.jpg 
/dir/to/extract/dir1/file1.jpg 
/dir/to/extract/dir1/file2.jpg 
/dir/to/extract/dir2/file.txt 
/dir/to/extract/file.mp3 

Tutte le idee ?

risposta

1

Leggere le voci restituite da ZipFile.namelist() per verificare se si trovano nella stessa directory, quindi aprire/leggere ogni voce e scriverlo in un file aperto con open().

0

Questo potrebbe essere un problema con l'archivio zip stesso. In un prompt python, prova a vedere se i file si trovano nelle directory corrette nel file zip stesso.

import zipfile 

zf = zipfile.ZipFile("my_file.zip",'r') 
first_file = zf.filelist[0] 
print file_list.filename 

Questo dovrebbe dire qualcosa come "dir1" ripetere i passaggi precedenti sostituendo e l'indice di 1 in filelist in questo modo first_file = zf.filelist[1] Questa volta l'output dovrebbe essere simile 'dir1/file1.jpg' se questo non è il caso quindi il file zip non contiene directory e verrà decompresso tutto in un'unica directory.

4

Se ho compreso correttamente la tua domanda, prima di estrarre le directory dei prefissi comuni dagli elementi nel file zip devi rimuovere tutte le directory dei prefissi.

Se è così, allora il seguente script dovrebbe fare quello che vuoi:

import sys, os 
from zipfile import ZipFile 

def get_members(zip): 
    parts = [] 
    # get all the path prefixes 
    for name in zip.namelist(): 
     # only check files (not directories) 
     if not name.endswith('/'): 
      # keep list of path elements (minus filename) 
      parts.append(name.split('/')[:-1]) 
    # now find the common path prefix (if any) 
    prefix = os.path.commonprefix(parts) 
    if prefix: 
     # re-join the path elements 
     prefix = '/'.join(prefix) + '/' 
    # get the length of the common prefix 
    offset = len(prefix) 
    # now re-set the filenames 
    for zipinfo in zip.infolist(): 
     name = zipinfo.filename 
     # only check files (not directories) 
     if len(name) > offset: 
      # remove the common prefix 
      zipinfo.filename = name[offset:] 
      yield zipinfo 

args = sys.argv[1:] 

if len(args): 
    zip = ZipFile(args[0]) 
    path = args[1] if len(args) > 1 else '.' 
    zip.extractall(path, get_members(zip)) 
+0

maggio si aggiungere alcuni commenti al fine di capire meglio cosa sta succedendo qui, per favore? – aturegano

+1

@aturegano. Ho aggiunto alcuni commenti al codice di esempio. I nomi file degli oggetti zipinfo sono scrivibili. Quindi lo script rimuove il prefisso comune da tutti i file nell'archivio, prima di estrarli nella directory di destinazione. – ekhumoro

Problemi correlati