2010-11-24 33 views
1

這是我第一次將代碼碎片拼湊起來,形成我需要的實用程序(我是一位貿易設計師),雖然我覺得我是關閉,我無法使以下工作。Python - 在多個目錄中搜索文件和ZIP

我經常需要壓縮具有.COD擴展名的文件,這些文件位於我創建的目錄結構中。作爲一個例子,該結構可以是這樣的:

(單根文件夾) - >(多個文件夾) - >(兩個文件夾) - >(一個文件夾) - > COD文件

我需要ZIP將所有COD文件放入COD.zip中,並將該zip文件放置在當前文件的上方一個目錄中。文件夾結構是這樣的,例如完成時:

導出文件夾 - > 9800文件夾 - > 6文件夾 - > OTA文件夾(+新COD.zip) - > COD文件

我的問題 -

首先,它創建的COD.zip似乎適合其中的COD文件,但是當我解壓縮它時,內部只有1.cod,但該ZIP的文件大小是所有COD壓縮在一起的大小。

秒,我需要COD文件壓縮W/O任何文件夾結構 - 直接在COD.zip內。目前,我的腳本創建了一個完整的目錄結構(以「users/mysuername/etc etc」開頭)。

任何幫助將不勝感激 - 和解釋,甚至更好,因爲我想學習:)

感謝。

import os, glob, fnmatch, zipfile 


def scandirs(path): 
for currentFile in glob.glob(os.path.join(path, '*')): 
    if os.path.isdir(currentFile): 
     scandirs(currentFile) 
    if fnmatch.fnmatch(currentFile, '*.cod'): 
      cod = zipfile.ZipFile("COD.zip","a") 
      cod.write(currentFile) 


scandirs(os.getcwd()) 

回答

1

對於問題#1,我覺得你的問題很可能是這一部分:

cod = zipfile.ZipFile("COD.zip","a") 
cod.write(currentFile) 

你正在創建一個新的壓縮(並且可能覆蓋現有的),每次你去寫新文件。相反,您要爲每個目錄創建一次zip,然後重複追加(參見下面的示例)。

對於問題#2,你的問題是,當你將它寫入檔案時,你可能需要將文件名變平。一種方法是使用os.chdir將CD複製到scandirs的每個目錄中。更簡單的方法是使用os.path模塊分割文件路徑並獲取基本名稱(不帶路徑的文件名),然後可以使用第二個參數cod.write來更改放入實際zip文件的文件名(請參閱示例下面)。

import os, os.path, glob, fnmatch, zipfile 

def scandirs(path): 

    #zip file goes at current path, then up one dir, then COD.zip 
    zip_file_path = os.path.join(path,os.path.pardir,"COD.zip") 
    cod = zipfile.ZipFile(zip_file_path,"a") #NOTE: will result in some empty zips at the moment for dirs that contain no .cod files 

    for currentFile in glob.glob(os.path.join(path, '*')): 
     if os.path.isdir(currentFile): 
     scandirs(currentFile) 
     if fnmatch.fnmatch(currentFile, '*.cod'): 
     cod.write(currentFile,os.path.basename(currentFile)) 

    cod.close() 
    if not cod.namelist(): #zip is empty 
     os.remove(zip_file_path) 

scandirs(os.getcwd()) 

因此創建zip文件一次,反覆附加到它,同時展開文件名,然後關閉它。您還需要確保您致電接近,否則您可能無法寫入所有文件。

我沒有一個很好的方法來測試這個地方在這一刻,所以隨時嘗試一下,並報告回來。我相信我可能會破壞一些東西。 ;-)

+0

我擔心這會讓太多的.zip文件句柄一次打開。你可以決定改變你的遞歸一下,先遞歸遍歷所有的目錄,並且只有當沒有更多的目錄時,然後執行當前目錄中的所有文件,而不是一次性混合執行文件和目錄。 – 2010-11-24 23:54:01

1

以下代碼具有相同的效果,但更易於重用,並且不會創建多個zip文件。

import os,glob,zipfile 

def scandirs(path, pattern): 
    result = [] 
    for file in glob.glob(os.path.join(path, pattern)): 
     if os.path.isdir(file): 
      result.extend(scandirs(file, pattern)) 
     else: 
      result.append(file) 
    return result 


zfile = zipfile.ZipFile('yourfile.zip','w') 
for file in scandirs(yourbasepath,'*.COD'): 
    print 'Processing file: ' + file 
    zfile.write(file)     # folder structure 
    zfile.write(file, os.path.split(file)[1]) # no folder structure 

zfile.close()