2011-08-10 14 views
10

Ho studiato python da circa 3 settimane e attualmente sto cercando di scrivere un piccolo script per ordinare i file (circa 10.000) con parole chiave e data che appaiono nel nome del file. I file prima di una determinata data devono essere aggiunti a un archivio. L'ordinamento funziona correttamente, ma non l'archiviazionePython: acquisizione di file in un archivio senza la directory?

Crea un archivio - il nome è valido - ma nell'archivio è il percorso completo dei file. Se lo apro, sembra: folder1 -> folder2 -> folder3 -> files.

Come posso modificarlo in modo che l'archivio contenga solo i file e non l'intera struttura?

Qui di seguito è un frammento con la mia funzione di cerniera, node è il percorso in cui i file sono stati prima della cernita, folder è una sottocartella con i file ordinati per una parola chiave nel nome, items sono le cartelle con i file ordinati per data.

Sto usando Python 2,6

def ZipFolder(node, zipdate): 
    xynode = node + '/xy' 
    yznode = node + '/yz' 
    for folder in [xynode,yznode]: 
     items = os.listdir(folder) 
     for item in items: 
      itemdate = re.findall('(?<=_)\d\d\d\d-\d\d', item) 
      print item 
      if itemdate[0] <= zipdate: 
       arcname = str(item) + '.zip' 
       x = zipfile.ZipFile(folder + '/' + arcname, mode='w', compression = zipfile.ZIP_DEFLATED) 
       files = os.listdir(folder + '/' + item) 
       for f in files: 
        x.write(folder + '/' + item + '/' + f) 
        print 'writing ' + str(folder + '/' + item + '/' + f) + ' in ' + str(item) 
       x.close() 
       shutil.rmtree(folder + '/' + item) 
    return 

Sono anche aperto a qualsiasi suggerimento e miglioramenti.

risposta

13

Da help (file zip):

| write(self, filename, arcname=None, compress_type=None) 
|  Put the bytes from filename into the archive under the name 
|  arcname. 

Quindi provare a cambiare la vostra scrittura() con:

x.write(folder + '/' + item + '/' + f, arcname = f) 

proposito il codice, mi sembra abbastanza buono, soprattutto per un 3 settimane pitonista, anche se alcuni commenti sarebbero stati accolti ;-)

+0

Non commenti ma docstring. Spiega cosa fa la funzione e per cosa è utile, non come funziona e la docstring è più utile per quello. –

+0

fantastico funziona, grazie per l'aiuto veloce. – rny

+0

@Jan Hudec: con docstring intendi sth in questo modo: def ZipFolder (nodo, zipdata): "" "file zip più vecchi di 'zipdate' nelle sottocartelle del 'nodo'" "" – rny

Problemi correlati