如何列举子目录所有档案 ? + 条件搜寻 ?
os.walk() 的用法釐清,记录一下体会心得,以下如有错误请指正。
source osWalkTest01.py
from os.path import joinimport 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 , filesfTree = os.walk(path,topdown=True)# 放三个list存放dList = [] # 某档案的 pathsList = [] # 该档案同一层的 目录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 fnmatchfiletypes = ['*.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()是否一次只能找一层 ??