2011-08-10 5 views
10

Uczę się Pythona przez około 3 tygodnie i obecnie próbuję napisać mały skrypt do sortowania plików (około 10.000) według słów kluczowych i daty pojawiającej się w nazwie pliku. Pliki przed określoną datą należy dodać do archiwum. Sortowanie działa dobrze, ale nie archiwizuje. Tworzy archiwum - nazwa jest w porządku - ale w archiwum jest pełna ścieżka do plików. Jeśli go otworzę, wygląda to tak: folder1 -> folder2 -> folder3 -> files.Python: Pobieranie plików do archiwum bez katalogu?

Jak mogę to zmienić tak, aby archiwum zawierało tylko pliki, a nie całą strukturę?

Poniżej znajduje się fragment z mojej funkcji zip, node jest ścieżka gdzie pliki były przed sortowaniem, folder jest podfolder z plików posortowanych według słowa kluczowego w nazwie, items są foldery z plików posortowanych według daty.

Używam 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 

Jestem również otwarty na wszelkie sugestie i ulepszeń.

Odpowiedz

13

Od pomoc (zipfile):

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

Więc spróbuj zmienić swój write() nazywają się:

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

O kodzie, wydaje mi się na tyle dobrze, zwłaszcza jak na 3 tydzień pythonist, chociaż kilka komentarzy byłoby mile widziane ;-)

+0

Brak komentarzy, ale docstring. Wyjaśnij, co robi funkcja i do czego jest przydatna, a nie jak działa, a docstrukcja jest najbardziej przydatna w tym celu. –

+0

niesamowite działa, thx za szybką pomoc. – rny

+0

@Jan Hudec: z docstring masz na myśli coś takiego: def ZipFolder (węzeł, zipdate): "" "zip pliki starsze niż" zipdate "w podfolderach" węzła "" "" – rny