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 建立和训练模型
阵列名称就是阵列第一个元素的记忆体位置,同理函数名称也是程序码在记忆体的第一个位置,既然有了记忆体位...
yo, what's up 今天就来谈谈 Functional Programming 的核心,Co...
今日练习档 ԅ( ¯་། ¯ԅ) 复制贴上,相信这两个动作是大家都会的,但其实它还有更深入的应用喔,...
这次写了自己刚学一年半左右的前端框架搭配测试, 小菜鸟的技术上还没有到很成熟,还请各位看官多多见谅呀...
JSONDecoder 将抓下来的资讯透过JSONDecoder这个将收集到的资讯进行使用 建立需要...