Python 搜寻子目录下档案+筛选条件 walk+fnmatch

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)} 个')

写完了,有没有冲动,想把它改成视窗介面?


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章