iT邦幫忙

1

列舉子目錄所有檔案Python os.walk + filter

  • 分享至 

  • xImage
  •  

如何列舉子目錄所有檔案 ? + 條件搜尋 ?
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 從上向下找

  • 第二個元素 subdirs 是個list,代表與檔案同一層的其它目錄,如果是空[],表示沒有下一層了。
# 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()是否一次只能找一層 ??


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言