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表示的是列表