Python os.walk 找档案很容易,可是 天坑 也不少。逐行注解、测试,才不会搞迷糊了。
延伸上一篇的基本写法,今天把它模组化(函数化) Source code download
套件 lib
from os.path import join
import os, fnmatch
两个函数:一个找所有档案、一个找特定档案。
findAll()
#--- 寻找某目录(包括子目录)下全部档案#--- 传入参数 nPath目录名称 / txtFile 将结果存档 #--- 传回一个 list fList 全部的档案名称 def findAll( nPath,txtFile ): ''' os.walk 递迴找出所有档案 fTree 传回一个tuple,包含三元素 dirs 该层的 path subdirs 该层的 目录s files 该层的 档案s topdown = True 从上向下找 ''' fTree = os.walk( nPath, topdown=True ) 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'len(dirs): {len(dirs)}') print(f'len(subdirs): {len(subdirs)}') print(f'len(files): {len(files)}') ''' # 检视成果 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(txtFile,'w',encoding='utf-8') for f in range(len(fList)): print(f'{dList[f]} {sList[f]} {fList[f]}',file=txt) txt.close() return fList # 传回这个list
findSome()
#--- 找某些类型的档案#--- 传入参数 nPath目录名称 / fTypes档案类型 / txtFile 将结果存档 #--- 传回一个 list allFiles 符合的档案名称 def findSome(nPath, fTypes, txtFile): allFiles = [] for dirs, subdirs, files in os.walk( nPath ): for extension in ( tuple(fTypes) ): for filename in fnmatch.filter(files, extension): filepath = os.path.join(dirs, filename) if os.path.isfile( filepath ): allFiles.append(filepath) print(filepath) # 把结果存档,以供验证 f = open( txtFile,'w',encoding='utf-8' ) for i in allFiles: print(f'{i}',file=f) f.close() return allFiles # 传回这个list
叫用的方法
#--- 流程 主轴 -----pathHere = os.getcwd() # 当前目录位置# 指定搜寻之目录 (或者预设为当前目录)path = input('从哪个资料夹 开始搜寻 ? ') or pathHereprint(f'搜寻资料夹: {path} (包含子目录)所有档案')#--- call the function findAll()txt1 = 'resultAll.txt'retAll = findAll(path, txt1)print(f'搜寻完成,全部档案: {len(retAll)} 个')#--- call the function findSome()# 要筛选的档案类型filetypes = ['*.jpg', '*.png', '*.doc'] txt2 = 'resultSome.txt'print('os.walk + filter 使用fnmatch的写法')retSome = findSome(path, filetypes, txt2)print(f'搜寻完成,符合的档案: {len(retSome)} 个')
写完了,有没有冲动,想把它改成视窗介面?