用Python实现遍历指定目录的所有子目录并删除指定文件
最近发现电脑中的有很多工作中产生的无用备份文件占用了大量硬盘空间,典型的就是bak扩展名的备份文件,但是这些文件都在工作目录下用360和Dism++都不好删除,为了节省笔记本电脑可怜的硬盘空间,就用Python编了一个小程序来清理。主要实现通过递归遍历指定目录下的所有目录查找*.bak通配文件名代表的冗余备份文件,找到文件记录位置,最后一起删除。
递归函数如下:
import os
import re
import time
filenames = []
# 递归遍历根目录下的所有目录查找指定文件
def findfile(filename, rootdir):
for fileordir in os.scandir(rootdir):
if fileordir.is_dir():
findfile(filename, fileordir.path)
else:
if filename.find('*') >= 0:
regularstring = filename
if filename.rfind(r'.') > 0: # 从右往左查找扩展名点号
regularstring = regularstring.replace(r'.', r'\.') # 将正则表达式中扩展名的.点号进行转义处理
regularstring = regularstring.replace('*', r'[\w.]*') # 将通配符*,替换成正则标识符
if re.match(regularstring, fileordir.name): # 匹配成功则放到全局列表中
filenames.append(fileordir.path)
print(fileordir.path)
else:
if fileordir.name == filename: # 没用通配符的完整文件名匹配
filenames.append(fileordir.path)
print(fileordir.path)
这个递归函数根据正则表达式匹配文件名,最后匹配的文件都放到全局列表中。遍历目录使用了os模块的scandir函数,这个函数返回一个DirEntry对象的迭代器,通过遍历这个迭代器查找匹配的文件和遍历子目录。如果是目录则递归调用本函数,如果是文件则进行匹配查找。
再用os模块的walk函数实现遍历查找功能,os.walk() 方法用于通过在目录树中游走输出在目录中的文件名,向上或者向下,walk函数返回一个生成器,可以用三个变量对其进行遍历,三个变量分别代表当前文件夹路径、当前文件夹下的子目录列表(注意不包含子目录的子目录)、当前文件夹下的文件列表。具体使用请参考教程:地址在此
代码如下:
# 用os.walk函数遍历目录实现文件查找
def findfile2(filename, rootdir):
list_dirs = os.walk(rootdir)
# root 表示当前正在访问的文件夹路径
# dirs 表示该文件夹下的子目录名list
# files 表示该文件夹下的文件list
for root, dirs, files in list_dirs:
for nowfile in files:
if filename.find('*') >= 0:
regularstring = filename
if filename.rfind(r'.') > 0: # 从右往左查找扩展名点号
regularstring = regularstring.replace(r'.', r'\.') # 将正则表达式中扩展名的.点号进行转义处理
regularstring = regularstring.replace('*', r'[\w.]*')
if re.match(regularstring, nowfile):
fullname = os.path.join(root, nowfile)
filenames.append(fullname)
print(fullname)
else:
if nowfile == filename:
fullname = os.path.join(root, nowfile)
filenames.append(fullname)
print(fullname)
执行代码如下:
if __name__ == '__main__':
starttime = time.time()
filenames.clear()
findfile("*.bak", "d:\\工作文件")
# findfile2("*.bak", "d:\\工作文件")
endtime = time.time()
print(f"搜索用时:{endtime-starttime:.3f}")
ret = input(f"你确认删除以上{len(filenames)}个文件吗?[y/n]")
if ret == 'y':
print("开始删除文件:")
for delfile in filenames:
try:
os.remove(delfile)
print(f"删除文件{delfile}成功!")
except Exception as e:
print(f"删除文件失败:{e}")
分别用两个遍历函数后可以看出,使用scandir函数的递归遍历效率更高一些。
码字不易,如果本文对您有用请随手点个赞,谢谢!^_^