2011-10-20 265 views
5

我對Python相當陌生,但我已經獲得了此代碼的工作,並且事實上,做它打算做的事情。Python刪除某些文件擴展名

但是,我想知道是否有更有效的方法來編碼,也許是爲了提高處理速度。

import os, glob 


def scandirs(path): 
    for currentFile in glob.glob(os.path.join(path, '*')): 
     if os.path.isdir(currentFile): 
      print 'got a directory: ' + currentFile 
      scandirs(currentFile) 
     print "processing file: " + currentFile 
     png = "png"; 
     jpg = "jpg"; 
     if currentFile.endswith(png) or currentFile.endswith(jpg): 
      os.remove(currentFile) 

scandirs('C:\Program Files (x86)\music\Songs') 

目前,大約有8000文件,這需要相當長的時間來處理每一個文件,並檢查它是否確實PNG或JPG結束。

+1

您可能想查看['os.path.walk'](http://docs.python.org/library/os.path.html#os.path.walk)。 –

+0

謝謝!我將使用它。 – Two

回答

15

既然你是遞歸到子目錄,使用os.walk

import os 

def scandirs(path): 
    for root, dirs, files in os.walk(path): 
     for currentFile in files: 
      print "processing file: " + currentFile 
      exts = ('.png', '.jpg') 
      if any(currentFile.lower().endswith(ext) for ext in exts): 
       os.remove(os.path.join(root, currentFile)) 
+0

@Sam:感謝您的糾正! – unutbu

+0

如果您將'exts =('。png','.jpg')'更改爲'exts = ['。png','.jpg']',那麼代碼也只能工作一個擴展名。 – AliBZ

+0

我認爲在最後執行第三個for循環會比使用'os.path.splitext()'方法並進行比較慢,但我對它進行了計時,這是最快的解決方案。 – Blairg23

1

如果該程序運行和速度是可以接受的,我不會改變它。

否則,你可以嘗試unutbu的答案。

一般來說,我會放棄使用

png = "png" 
jpg = "jpg" 

的東西,我看不出在不直接使用字符串的任何目的。

更好的測試「.png」而不是「PNG」。

一個更好的解決辦法是定義

extensions = ('.png', '.jpg') 

centally的地方,並使用在

if any(currentFile.endswith(ext) for ext in extensions): 
    os.remove(currentFile)