如何列舉子目錄所有檔案 ? + 條件搜尋 ?
os.walk() 的用法釐清,記錄一下體會心得,以下如有錯誤請指正。
source osWalkTest01.py
from os.path import join
import os
# 程式所在之目錄位置
pathHere = os.getcwd()
# 指定搜尋之目錄
path = input('從哪個資料夾 開始搜尋 ? ')
print(f'Dir to be searched: {path}')
fTree 傳回一個tuple,包含三元素
dirs 該層的 path
subdirs 該層的 目錄s
files 該層的 檔案s
topdown = True 從上向下找
# os.walk 遞迴找出所有檔案
# fTree 傳回一個tuple,包含三元素 dirs, subdirs , files
fTree = os.walk(path,topdown=True)
# 放三個list存放
dList = [] # 某檔案的 path
sList = [] # 該檔案同一層的 目錄
fList = [] # 該檔案的fullPathName
# 逐層向下
for dirs, subdirs, files in fTree:
for f in files:
# 添加入 list
dList.append(dirs)
sList.append(subdirs)
# dirs+f 組合成 檔案的fullpathname
fullpath = join(dirs,f)
fList.append(fullpath)
此時 dirs, subdirs,files 只是最後一個folder的搜尋結果,並不是全部檔案的path
# 檢視成果
print(f'dir count : {len(dList)}')
print(f'sList count: {len(sList)}')
print(f'file count : {len(fList)}')
# 印出來看看
for f in range(len(fList)):
print(dList[f],sList[f],fList[f])
# 把結果存檔,以供驗證
txt = open(pathHere+'\\walkResult.txt','w',encoding='utf-8')
for f in range(len(fList)):
print(f'{dList[f]} {sList[f]} {fList[f]}',file=txt)
txt.close()
上面是搜尋*.*所有檔,那麼如果要加上搜尋條件該如何寫 ?
運用 import fnmatch
import fnmatch
filetypes = ['*.jpg', '*.doc','*.pdf']
for dirs, subdirs, files in os.walk( path ):
for extension in ( tuple(filetypes) ):
for filename in fnmatch.filter(files, extension):
filepath = os.path.join(dirs, filename)
if os.path.isfile( filepath ):
print( filepath )
嗯,又來了個新模塊 fnmatch,看來又有功課要研究了。
ps. glob.glob()也可以達到上述功能,不過目前還卡在: 一個. 兩個.. \ / 這類的問題上
不過,glob()是否一次只能找一層 ??