python 递归遍历所有文件 & 文件夹

979 阅读4分钟

前言: 微软的那个搜索文件找东西比较拉跨,有了python就自己弄一个,这里相当于是一个比较小白的python os模块练习,望各位BigFish勿喷 多提改进建议,提前感谢🤲

代码执行的效果大概如下图所示: 在这里插入图片描述 下面把具体思路以及代码分享贴出,自己目前小白菜鸟一枚,各路大神多担待,如有指教,感激不尽

一、主要使用的模块以及方法

模块:python 自带的 os 以及 time 模块,time模块没发挥太多作用 方法:

  • os.path.isdir() #判断路径文件是否是文件夹,是返回True,反之False
  • os.path.isfile() #判断路径文件是否是文件,是返回True,反之False
  • os.path.abspath() # 得到一个当前传入路径的绝对路径
  • os.path.dirname() # 传入 file 获取当前文件所在路径的父级目录
  • os.listdir() # 传入一个目录,得到该目录下的子级文件或文件名的列表,不含父级目录
  • os.startfile() # 传入一个目录,直接打开对应的文件或文件夹
  • time.time() # 获取到当前时间戳
  • str.index() #内置字符串查找方法,当传入的值中在str中时得到传入值得下标,如果没有则抛出异常值: ValueError

二、主要思路以及代码

  1. 开始位置
    这里主要是通过输入需要查找父级文件夹和需要查找得文件进行判断已经定义一些下面需要使用的变量
    user_route = input('\n请输入查询路径后按下回车,不输入直接回车将从当前文件位置开始查找:')
    user_file = input('请输入查找文件名,如果直接输入全部文件请直接回车:')
    father_route = os.path.abspath(user_route)
    find_file_list = []
    find_file_name = '★ 找到文件 >> '
    find_dir_name = '☆ 找到文件夹 >> '
    # 如果不输入路径就重新用给父级路径赋值,赋值内容为当前文件所在位置
    if user_route == '':
        father_route = os.path.dirname(__file__)
    # 如果不输入查找文件名,则直接将两个找到的文件的给予的变量赋值为空
    father_bool = os.path.isdir(father_route)
    if not father_bool:
        print('你的路径有问题,请重新输入')
        continue
    start_time = time.time()
    total_file = 0 #初始化总文件变量
    total_dir = 0 #初始化总文件夹变量
  1. 关键位置 下面是主要执行文件查找得递归函数,主要的思路是在该函数中传入查找的父级目录,先通过方法 os.path.isdir() 判断传入的是不是一个目录,如果是就通过 os.listdir()方法查找该目录的下一级中的所有文件或文件夹得到一个列表,通过遍历该列表得到文件或文件夹名,再进行地址拼接得到一个准确的文件地址,继续通过 两个方法【 os.path.isdir() 和 os.path.isfile()】对拼接的文件地址进行判断,如果已经是文件了就直接输出地址,如果是文件夹就继续进行递归查询。
def find_path(dir_father):
        global total_file, total_dir  # 定义全局上的两个总数变量
        father_bool = os.path.isdir(dir_father)  # 判断传入的是不是还是一个文件夹
        if father_bool:
            dir_list = os.listdir(dir_father)  # 将传入的文件夹继续遍历到列表中
            for dir in dir_list:
                dir_child = dir_father + '\\' + dir  # 拼接合成路径
                dir_bool = os.path.isfile(dir_child)  # 再次判断该路径是不是一个文件
                # 通过判断该路径下的文件是不是一个文件后进行判断输出
                if dir_bool:
                  # 有文件后总文件数 +1
                    total_file += 1
                    try:
                        index = dir_child.index(user_file)
                        if index > 1:
                            print(find_file_name+dir_child)
                            find_file_list.append(dir_child)
                        else:
                            print(dir_child)
                    except ValueError:
                        print('\t'+dir_child)
                else:
                    try:
                        index = dir_child.index(user_file)
                        if index > 1:
                            print(find_dir_name+dir_child)
                            find_file_list.append(dir_child)
                        else:
                            print(dir_child)
                    except ValueError:
                        pass
                    find_path(dir_child)
                    # 有文件夹后文件夹数加一
                    total_dir += 1

find_path(father_route)
  1. 结果输出 这里和开头差不多,没太多好说的,就是最后代码执行完毕后对结果进行输出。通过time模块得到时间戳,获取输出的时间。
    end_time = time.time()
    total_time = end_time - start_time
    print('\n总共查找了{}个文件夹,查询到了{}个文件,耗时{}秒'.format(
        total_dir, total_file, total_time))
    if user_file != '':
        file_len = len(find_file_list)
        if file_len == 0:
            print('未查找到该文件或文件夹')
        else:
            print('查找到的文件以及文件夹共有【{}】个:以下是查询文件的具体位置\n'.format(file_len))
            for file in find_file_list:
                print(file)
             

尾部

通过这个代码可以很快得查询到你需要得文件夹位置,然后通过复制该位置得地址,直接进入该文件位置或者打开该文件,如果感觉所有文件都输出不太好,也可将输出位置进行注释,只保留最后得结果输出就可以了

结语

自己这里把本来应该有的源码删除了,希望看到文章的都应该自己去思考学习一下,别人的代码终究是别人的,还是需要自己去练去写去想才行,提高自己编程的价值,形成自己的核心竞争力。当然需要源码的也可私信给我,可以免费发给你。关键还是需要自己多思考。 希望大家不嫌啰里啰唆,文章还有很多需要打磨的地方,正在慢慢练习,感谢各位看官小天使的支持