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

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


<<:  [Day7] IoT Maker之Coding知识科普 - (Variable)

>>:  IOS、Python自学心得30天 Day-5 TensorFlow 建立和训练模型

Day22

阵列名称就是阵列第一个元素的记忆体位置,同理函数名称也是程序码在记忆体的第一个位置,既然有了记忆体位...

Day 04 - Function Composition

yo, what's up 今天就来谈谈 Functional Programming 的核心,Co...

Day-7 Excel的贴上小技巧

今日练习档 ԅ( ¯་། ¯ԅ) 复制贴上,相信这两个动作是大家都会的,但其实它还有更深入的应用喔,...

【Day30】参赛感言

这次写了自己刚学一年半左右的前端框架搭配测试, 小菜鸟的技术上还没有到很成熟,还请各位看官多多见谅呀...

JSONDecoder 介绍 Day 16

JSONDecoder 将抓下来的资讯透过JSONDecoder这个将收集到的资讯进行使用 建立需要...