用Python实现遍历指定目录的所有子目录删除指定文件

用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函数的递归遍历效率更高一些。
码字不易,如果本文对您有用请随手点个赞,谢谢!^_^

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 你可以使用 PHP 的 opendir()、readdir() 和 closedir() 函数来遍目录路径。下面是一个示例代码: ```php <?php $dir = "/path/to/directory"; // 打开目录 if (is_dir($dir)){ if ($dh = opendir($dir)){ // 遍目录中的文件子目录 while (($file = readdir($dh)) !== false){ // 忽略 . 和 .. 目录 if($file != "." && $file != ".."){ echo "filename: " . $file . "<br>"; } } // 关闭目录 closedir($dh); } } ?> ``` 在上面的示例中,$dir 是要遍目录路径。首先,使用 is_dir() 函数检查该路径是不是一个目录。如果是目录,则使用 opendir() 函数打开该目录,并使用 readdir() 函数遍目录中的文件子目录。在遍过程中,忽略 . 和 .. 目录。最后,使用 closedir() 函数关闭目录。 ### 回答2: 在PHP中,可以使用`scandir`函数来遍目录路径。`scandir`函数可以返回指定路径下的所有文件子目录的名称。 下面是使用`scandir`函数遍目录路径的示例代码: ``` <?php $path = "目录路径"; // 替换为你要遍目录路径 // 使用scandir函数获取指定路径下的所有文件子目录的名称 $files = scandir($path); // 遍得到的文件子目录的名称 foreach ($files as $file) { // 排除当前目录(.)和上级目录(..) if ($file == '.' || $file == '..') { continue; } // 根据文件目录的名称进行相应的操作 $filePath = $path . '/' . $file; if (is_dir($filePath)) { // 如果是目录,可以进行递归遍或其他操作 echo "目录:$file\n"; } else { // 如果是文件,可以进行相应的操作 echo "文件:$file\n"; } } ?> ``` 在上述代码中,首先通过`scandir`函数获取指定路径下的所有文件子目录的名称。然后使用`foreach`循环遍得到的文件子目录的名称。使用`is_dir`函数判断是文件还是目录,并进行相应的操作。 需要注意的是,在遍之前排除了当前目录(.)和上级目录(..),因为它们在任何目录中都是固定的。 运行以上代码,你可以替换`目录路径`为你要遍目录路径,然后执行该代码,就可以输出该目录下的所有文件子目录的名称。 ### 回答3: 在PHP中,可以使用`opendir()`函数打开一个目录,然后使用`readdir()`函数读取目录中的内容,实现目录的功能。 首先,我们使用`opendir()`函数打开目录,将目录的路径作为参数传入,得到一个目录的句柄,如下所示: ```php $dir = opendir('path/to/directory'); ``` 接下来,我们可以使用`readdir()`函数读取目录中的内容。`readdir()`函数会依次读取目录中的文件子目录,直到读取完所有内容或者出现错误。每次读取一个内容,可以通过循环来遍目录中的所有内容,如下所示: ```php while (($file = readdir($dir)) !== false) { // 对每个文件子目录进行处理 echo $file."<br>"; } ``` 在循环体内,我们可以对每个文件子目录进行处理,例如打印文件名或执行其他操作。在上面的示例中,我们使用`echo`语句打印每个文件子目录的名称。 最后,遍结束后,我们需要关闭目录句柄,以释放资源: ```php closedir($dir); ``` 综上所述,以上代码片段演示了如何使用PHP遍目录路径。我们首先使用`opendir()`函数打开目录,然后使用`readdir()`函数读取目录中的内容,并对每个文件子目录进行处理。最后,我们使用`closedir()`函数关闭目录句柄。这样,我们就可以在PHP中实现目录的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值