首頁 > 後端開發 > Python教學 > Python遍歷目錄中的所有檔案的方法

Python遍歷目錄中的所有檔案的方法

WBOY
發布: 2016-07-22 08:56:25
原創
1557 人瀏覽過

os.walk產生器
os.walk(PATH), PATH是個資料夾路徑,當然可以用.或../這樣啦.
回傳的是個三元元組為元素的列表, 每個元素代表了一個資料夾下的內容.第一個就是當前資料夾下內容.
傳回的三元元組代表(該工作資料夾, 該資料夾下的資料夾的清單, 該資料夾下檔案的清單).
所以,
取得所有子資料夾, 就是(d代表這三元元組):

os.path.join(d[0],d[1]);
登入後複製

取得所有子檔案, 就是:

 os.path.join(d[0],d[2]);
登入後複製

以下範例使用了兩套循環, 遍歷後得到所有檔案名稱的list後再循環所有檔案:

result = [os.path.join(dp, f) for dp, dn, fs in os.walk("_pages") for f in fs if os.path.splitext(f)[1] == '.html']
for fname in result:
 #do something
登入後複製

實際等於

result=[]
for dp, dn, fs in os.walk("_pages"):
 for f in fs:
 if (os.path.splitext(f)[1] == '.html'):
  result.append(os.path.join(dp, f))
for fname in result:
 #do something
登入後複製

最後判斷是否html字尾取得檔名, 也可以使用glob:

result = [y for x in os.walk(PATH) for y in glob.glob(os.path.join(x[0], '*.txt'))]
登入後複製

也可以使用迭代器方法:

from itertools import chain
import glob
result = (chain.from_iterable(glob.iglob(os.path.join(x[0], '*.txt')) for x in os.walk('.')))
登入後複製

進階
標準檔案數遍歷產生器os.walk既強大又靈活,不過os.walk還缺乏應用程式所需的一些細節上的處理能力,例如根據某種模式選擇文件,對所有文件(或目錄)進行排序,或只遍歷目前目錄不進入其子目錄,因此需要對介面對應進行封裝。

import os, fnmatch 
 
def filter_files(dirname, patterns='*', single_level=False, yield_folders=False): 
  patterns = patterns.split(';') 
  allfiles = [] 
  for rootdir, subdirname, files in os.walk(dirname): 
    print subdirname 
    allfiles.extend(files) 
    if yield_folders: 
      allfiles.extend(dubdirname) 
    if single_level: 
      break 
  allfiles.sort() 
  for eachpattern in patterns: 
    for eachfile in fnmatch.filter(allfiles, eachpattern): 
        print os.path.normpath(eachfile) 

登入後複製

說明:
1.extend與append的差別
列表是以類別的形式實現的。 「創建」清單實際上是將一個類別實例化。因此,列表有多種方法可以操作。  清單可包含任何資料類型的元素,單一清單中的元素無須全為相同類型。 append() 方法在清單的尾部新增一個新的元素。只接受一個參數,extend()方法只接受一個列表作為參數,並將該參數的每個元素都加到原有的列表中。
2. fnmatch模組
fnmatch 模組使用模式來匹配檔案名稱。模式語法和 Unix shell 中所使用的相同. 星號(*) 匹配零個或更多個字元, 問號(?) 匹配單一字元。你也可以使用方括號來指定字元範圍,例如 [0-9] 代表一個數字,其他所有字元都符合它們本身。
1) fnmatch.fnmatch(name, pattern)方法:測試name是否符合pattern,回傳true/false
2) fnmatch.filter(names, pat)實作列表特殊字元的過濾或篩選,傳回符合匹配模式的字元列表,當然names表示的是列表

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板