一文弄懂 Python os.walk(),轻松搞定文件处理和目录遍历

2024-07-08 1241阅读

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/


Python os 模块的 walk() 方法以自顶向下或自底向上的方式遍历指定的目录树,从而显示目录树中的文件名。对于目录树中的每个目录,os.walk() 方法都会产生一个包含目录路径、当前目录下的子目录列表和文件名的三元组。

当您使用 Python 进行文件处理和目录遍历时,os.walk() 是一个非常有用的函数。这个函数允许您以递归的方式遍历一个目录树,获取关于目录结构的信息,包括其子目录和文件。接下来,我将详细解释 os.walk() 的工作原理以及如何使用它。

本文的思维导图如下所示:

一文弄懂 Python os.walk(),轻松搞定文件处理和目录遍历

os.walk() 的基本工作原理

os.walk(top, topdown=True, onerror=None, followlinks=False) 是 os 模块中的一个函数,用于生成遍历目录树的文件名。这个函数返回一个三元组 (dirpath, dirnames, filenames)。

  • dirpath 是一个字符串,表示正在遍历的目录的路径。
  • dirnames 是一个列表,包含了 dirpath 下所有子目录的名字。
  • filenames 是一个列表,包含了非目录文件的名字。

    参数详解

    1. top:要遍历的顶级目录的路径。
    2. topdown (可选):如果为 True(默认值),则从顶级开始向下遍历。如果为 False,则从底部的子目录开始向上遍历。
    3. onerror (可选):是一个函数,用于错误处理。如果指定,则应该是一个接受单个参数(异常实例)的函数。如果未指定或为 None,错误将被忽略。
    4. followlinks (可选):如果为 True,则会遍历符号链接指向的目录。

    使用示例

    假设我们有以下目录结构:

    my_project/
    ├── main.py
    ├── module1
    │   ├── __init__.py
    │   └── utils.py
    └── module2
        ├── __init__.py
        └── helper.py
    

    我们想要遍历 my_project 目录并打印出其结构:

    import os
    # 指定顶级目录路径
    top_path = 'my_project'
    # 使用 os.walk() 遍历目录
    for dirpath, dirnames, filenames in os.walk(top_path):
        print(f"当前目录: {dirpath}")
        print("子目录:")
        for dirname in dirnames:
            print(f"  {dirname}")
        print("文件:")
        for filename in filenames:
            print(f"  {filename}")
        print("-" * 20)        # 打印分隔线以区分不同的目录
    

    输出结果将是:

    当前目录: my_project
    子目录:
      module1
      module2
    文件:
      main.py
    --------------------
    当前目录: my_project/module1
    子目录: []
    文件:
      __init__.py
      utils.py
    --------------------
    当前目录: my_project/module2
    子目录: []
    文件:
      __init__.py
      helper.py
    --------------------
    

    通过上面这个简单例子,您可以看到 os.walk() 如何能够帮助我们递归地遍历整个 my_project 目录树,并且获取每个目录中的文件和子目录列表。

    总结与讨论

    os.walk() 函数是 Python 中用于遍历目录树的一个非常实用的工具。这个函数会生成目录树中的文件名,通过在目录树中游走(walk)来完成这一任务。接下来,我们将探讨 os.walk() 实际上是深度优先搜索(DFS)还是广度优先搜索(BFS)。

    深度优先搜索(DFS)与广度优先搜索(BFS):

    • DFS 是一种从根节点开始,沿着一条路径尽可能深地探索,直到到达叶子节点或无法继续为止,然后回溯到前一个节点,继续探索其他路径的算法。操作步骤:从根节点开始,访问一个未访问的邻居节点,然后递归地访问这个邻居节点的未访问邻居节点。当所有邻居节点都已访问或没有未访问的邻居节点时,回溯到上一个节点。优点:空间效率高,适用于路径和配置问题;缺点:时间复杂度可能高,可能不会找到最短路径。
    • BFS 是一种从根节点开始,先访问所有直接相连的邻居节点,然后访问这些邻居节点的所有邻居节点,以此类推,直到访问完所有可达节点或达到目标节点。操作步骤:使用队列存储待访问的节点,首先将根节点入队,然后从队列中取出队首节点进行访问,并将其未访问的邻居节点入队。重复这个过程,直到队列为空或找到目标节点。优点:适用于求源点与目标节点距离近的情况,如最短路径问题;缺点:可能需要较大的内存空间来存储队列中的节点。

      DFS 与 BFS 的区别:

      • 数据结构:DFS 通常使用栈作为辅助数据结构,而 BFS 使用队列。
      • 访问节点的方式:DFS 是深度优先,先访问一条路径到底,然后回溯;BFS 是广度优先,先访问所有直接相连的节点。
      • 应用:DFS 适合求解一个任意符合方案中的一个或者遍历所有情况,如全排列、拓扑排序;BFS 适合求最短路径或最小步数的情况。

        默认情况下,os.walk() 采用自顶向下的方式遍历目录树,可以认为这种方式较类似于深度优先搜索(DFS)。在自顶向下模式下,对于每个目录,它会首先返回该目录中的文件和子目录列表,然后递归进入子目录。os.walk() 实质上是以深度优先搜索(DFS)策略来遍历文件系统的目录树。无论是在默认的自顶向下模式还是可选的自底向上模式中,它都首选深入每个分支直到末端再回溯到其他分支。


        📚️ 相关链接:

        • os.walk() 的详细理解(秒懂)

        • AI 搜索 - 对 os.walk() 的基本原理和功能进行全面而透彻的调研

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]