IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python递归遍历查询文件 & 文件夹 -> 正文阅读

[Python知识库]python递归遍历查询文件 & 文件夹

起因: 也不知道具体什么起因了,貌似是嫌弃微软的那个搜索文件找东西很慢太拉跨,有了python就自己弄一个,网上也很多,但自己写出来得总归感觉不一样,也算是自己得练习了
代码执行的效果大概如下图所示:
在这里插入图片描述
下面把具体思路以及代码分享贴出,自己目前小白菜鸟一枚,各路大神多担待,如有指教,感激不尽
一、主要使用的模块以及方法
模块:python 自带的 os 以及 time 模块,time模块没发挥太多作用
方法:

  • os.path.isdir() #判断路径文件是否是文件夹,是返回True,反之False
  • os.path.isfile() #判断路径文件是否是文件,是返回True,反之False
  • os.path.abspath() # 得到一个当前传入路径的绝对路径
  • os.path.dirname() # 传入 file 获取当前文件所在路径的父级目录
  • os.listdir() # 传入一个目录,得到该目录下的子级文件或文件名的列表,不含父级目录
  • 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. 无关痛痒 这里和开头差不多,没太多好说的,就是最后代码执行完毕后对结果进行输出
    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)
             

三、最后附上全部源码

import os
import time
while True:
    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
    print('开始执行,当前文件夹是:', father_route, '\n以下是当前文件夹中查找到的文件:')
    print('\n'+'*'*100)
    start_time = time.time()
    total_file = 0
    total_dir = 0
    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)
    print('\n'+'*'*100)
    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)
    break

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 23:20:55  更:2022-04-01 23:21:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 20:32:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码