程序分为两步,第一步,采用递归的方式获得文件夹下所有文件的路径列表;第二步,从文件路径列表中根据后缀利用.endswith(后缀)
的方法筛选指定文件。直接上完整程序,说明以注释的方式给出。
程序中涉及到了 list循环remove的问题
import os
# 从指定path下递归获取所有文件
def getAllFile(path, fileList):
dirList = [] # 存放文件夹路径的列表
for ff in os.listdir(path):
wholepath = os.path.join(path, ff)
# wholepath = path+'/'+ff
if os.path.isdir(wholepath):
dirList.append(wholepath) # 如果是文件添加到结果文件列表中
if os.path.isfile(wholepath):
fileList.append(wholepath) # 如果是文件夹,存到文件夹列表中
for dir in dirList:
getAllFile(dir, fileList) # 对于dirList列表中的文件夹,递归提取其中的文件,fileList一直在往下传,所有的文件路径都会被保存在这个列表中
# 从文件路径列表中筛选出指定后缀的文件
# 这里可以从源列表中删除 非后缀 项,也可以新建一个 后缀列表,遍历源列表向后缀列表中.append()后缀项
# 后者更容易一些,我这里选择了前者,还费劲解决了一波list循环remove的问题。。。
# list循环remove http://itdarcy.wang/index.php/20200109/381
def getSufFilePath(fileList, suffix):
# print(len(fileList))
for ff in fileList[:]:
if not ff.endswith(suffix):
fileList.remove(ff)
if __name__ == '__main__':
flist = []
findpath = r'D:\Test'
getAllFile(findpath, flist)
print('allfile:', len(flist)) # filepath下的文件总数
getSufFilePath(flist, '.doc')
print('Docfile:', len(flist)) # filepath下的指定文件总数(这里是.doc文件的数量)
for ff in flist:
print(ff)