因为有了一个想从一个大文件夹下find出所有的.doc文件的需求,这个需求的关键活动就是递归获得文件夹下的所有文件。通过一番找资料,整理出两种递归获取指定文件夹下所有文件夹、文件的方法。
- 方式一,使用os.walk(path)函数获取
使用该函数需要导入os模块。
import os
函数返回元素是(文件夹,[文件夹下的文件夹列表],[文件夹下的文件列表])
的一个列表,通过循环拼接可以获得指定路径下所有层次的文件夹和文件全路径。最后return文件夹列表和文件列表。
# 方式一,使用os.walk(path)方法
def getAllSub(path):
Dirlist = []
Filelist = []
for home, dirs, files in os.walk(path):
# 获得所有文件夹
for dirname in dirs:
Dirlist.append(os.path.join(home, dirname))
# 获得所有文件
for filename in files:
Filelist.append(os.path.join(home, filename))
return Dirlist, Filelist
- 方式二,通过递归调用一层层获取
# 方式二,通过递归调用一层层获取
def getAllSub2(path, dirlist=[], filelist=[]):
flist = os.listdir(path)
for filename in flist:
subpath = os.path.join(path, filename)
if os.path.isdir(subpath):
dirlist.append(subpath) # 如果是文件夹,添加到文件夹列表中
getAllSub2(subpath, dirlist, filelist) # 向子文件内递归
if os.path.isfile(subpath):
filelist.append(subpath) # 如果是文件,添加到文件列表中
return dirlist, filelist
- 测试一下
if __name__ == "__main__":
path = r'E:\ZYD\temporary\DesktopMirror\Test'
# Dirlist, Filelist = getAllSub(path)
Dirlist, Filelist = getAllSub2(path)
print(Dirlist)
print(Filelist)
- 其他实现
之前我写了一篇 Python递归获取指定文件夹下所有指定后缀的文件路径 ,里面用到的是方式二,但是里面的代码很散乱,这里用写好的方法再实现一下
还是要用到其中从fileList删除不包含指定后缀的函数
def getSufFilePath(fileList, suffix):
# print(len(fileList))
for ff in fileList[:]: # 这种写法可以避免循环判断删除时跳过一些项
if not ff.endswith(suffix):
fileList.remove(ff)
这个功能也很容易就改写成了递归获取指定文件夹下所有包含某关键字的文件路径,只需要将
if not ff.endswith(suffix):
# 将上面一行改为
if not suffix in ff:
功能实现
if __name__ == "__main__":
path = r'E:\ZYD\temporary\DesktopMirror\Test'
filelist = getAllSub(path)[1]
getSufFilePath(fileList, '.doc')
print(filelist)
实测比windows自带的搜索还会快一点。
来源:CSDN
作者:BBJG_001
链接:https://blog.csdn.net/BBJG_001/article/details/104010263