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

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


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

当您使用 Python 进行文件处理和目录遍历时,os.walk() 是一个非常有用的函数。这个函数允许您以递归的方式遍历一个目录树,获取关于目录结构的信息,包括其子目录和文件。接下来,我将详细解释 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
子目录:module1module2
文件:main.py
--------------------
当前目录: my_project/module1
子目录: []
文件:__init__.pyutils.py
--------------------
当前目录: my_project/module2
子目录: []
文件:__init__.pyhelper.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() 的基本原理和功能进行全面而透彻的调研

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/855224.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java17 --- redis7缓存双写一致性

一、缓存双写一致性 如果redis中有数据:需要和数据库中的值相同。如果redis中没有数据:数据库中的值要是最新值,且准备回写redis。只读缓存。读写缓存:①、同步直写策略:写数据库后也同步写redis缓存,缓存…

光纤三维布里渊温度和应变分布matlab模拟与仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 光纤三维布里渊温度和应变分布matlab模拟与仿真。其中 , 布里渊散射是光波与声波在光纤中传播时相互作用而产生的光散射过程 , 在不 同的条件下 , 布里渊散射又分…

70、最长上升子序列

最长上升子序列 题目描述 给定一个长度为N的数列,求数值严格单调递增的子序列的长度最长是多少。 输入格式 第一行包含整数N。 第二行包含N个整数,表示完整序列。 输出格式 输出一个整数,表示最大长度。 数据范围 1 ≤ N ≤ 1000 &am…

数据结构与算法-字符出现的次数

问题描述 以下是这个找出字符串中字符串出现频率最多的字符。大家可以自行研究一下,题目不难,我今天尝试使用C语言来完成解答,但是在解答过程居然出现了一个意想不到的问题。可能是高级语言用多了,C语言某些函数的限制和风险忘记管…

C++之std::type_identity

目录 1.简介 2.C20的std::type_identity 3.使用 type_identity 3.1.阻止参数推导 3.1.1.模板参数推导过程中的隐式类型转换 3.1.2.强制显式实例化 3.2.阻止推断指引 3.3.类型保持 3.4.满足一些稀奇古怪的语法 4.示例 5.总结 1.简介 std::type_identity 是 C17 引入的…

Spring框架对BeanUtils.copyProperties的优化

前言 在高并发环境下,我们难免要进行大量的存库操作,而一般的操作是监听kafka然后将消息转换成实体类,再使用一些orm框架(mybatis-plus,jpa等)进行入库,我们在将消息转换的时候难免要用到反射,今天我们来讲讲Spring框…

【Python/Pytorch - 网络模型】-- 手把手搭建E3D LSTM网络

文章目录 文章目录 00 写在前面01 基于Pytorch版本的E3D LSTM代码02 论文下载 00 写在前面 测试代码,比较重要,它可以大概判断tensor维度在网络传播过程中,各个维度的变化情况,方便改成适合自己的数据集。 需要github上的数据集…

这些数据可被Modbus采集,你还不知道???

为什么要用Modbus采集模块 Modbus采集模块之所以被广泛使用,是因为它提供了标准化的通信协议,确保了不同设备间的兼容性。它支持多种通信方式,易于实现,并且能够适应不同的网络环境。Modbus模块能够收集和传输各种工业数据&#x…

[递归和栈] Boolean Expressions

描述 The objective of the program you are going to produce is to evaluate boolean expressions as the one shown next: Expression: ( V | V ) & F & ( F | V ) where V is for True, and F is for False. The expressions may include the following operator…

061、Python 包:模块管理

包(Package)是一种用于组织模块的层次结构。包实际上就是一个包含了__init__.py文件的目录,该文件可以为空或包含包的初始化代码。通过使用包,可以更好地组织和管理大型项目中的模块,避免命名冲突,并提高代…

Hadoop+Spark大数据技术(自命题试卷测试)

试卷一 一、选择题 (每小题2分,共20分) 1. Hadoop 核心组件包括: A. HDFS 和 Hive B. HDFS 和 MapReduce C. HBase 和 Spark D. YARN 和 ZooKeeper 2. HDFS 数据块存储方式的优势不包括: A. 文件大小不受单一磁盘大小…

kettle从入门到精通 第七十一课 ETL之kettle 再谈http post,轻松掌握body中传递json参数

场景: kettle中http post步骤如何发送http请求且传递body参数? 解决方案: http post步骤中直接设置Request entity field字段即可。 1、手边没有现成的post接口,索性用python搭建一个简单的接口,关键代码如下&#…

深度学习模型的生命周期与推理系统架构

目录 深度学习模型的生命周期 ​编辑 深度学习模型的生命周期 推理相比训练的新特点与挑战 推理系统架构 推理系统 vs 推理引擎 顶层:API接口和模型转换 中层:运行时(计算引擎) 底层:硬件级优化 边缘设备计算 主要问题 边缘部署和推理方式 方式1:边缘设备计…

可提供实习证明/实习鉴定报告,企业项目试岗实训开营啦

在数字化转型的浪潮中,大数据和人工智能等前沿技术已成为推动经济发展和科技进步的关键动力。当前,全球各行各业都在积极推进数字化转型,不仅为经济增长注入新活力,也对人才市场结构产生了深刻影响,尤其是对数字化人才…

如何编辑和修改ROM,快速上手

编辑和修改ROM是一个相对复杂的过程,需要一定的技术知识和准备。以下是编辑和修改ROM的详细步骤,供您参考: 一、准备工作 准备一台可root的安卓手机,并确保手机已解锁bootloader。 在电脑上下载并安装ADB(Android De…

关于lamda表达式的使用

Lambda表达式是一种匿名函数,即没有函数名的函数,它可以以更简洁、更灵活的方式编写代码。以下是Lambda表达式的常用方式: 无参数,无返回值: 如果抽象方法不带参数且不返回值,可以使用空括号和主体编写Lambda表达式。例如:() -> System.out.println(“Hello, World!…

力扣(2024.06.18)

1. 39——组合总和 给你一个无重复元素的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有不同组合,并以列表形式返回。你可以按任意顺序返回这些组合。candidates 中的同一个数字可以无限制重复被选…

CentOS更新镜像源

0、背景 Linux下安装很多指令或者工具时,发现yum执行超时或者返回没找到有效的package,此时需要更新yum源 Yum(Yellowdog Updater Modified)是一种在 Linux 操作系统中用于软件包管理的工具 Yum 源就是存储那些软件包及其相关信息…

在 KubeSphere 上快速安装和使用 KDP 云原生数据平台

作者简介:金津,智领云高级研发经理,华中科技大学计算机系硕士。加入智领云 8 余年,长期从事云原生、容器化编排领域研发工作,主导了智领云自研的 BDOS 应用云平台、云原生大数据平台 KDP 等产品的开发,并在…

基因名写作的规范

基因名写作的规范通常会因物种和领域的不同而有所变化,但以下是一些通用的指导原则: 斜体表示基因名:在论文和其他科学文献中,基因名通常用斜体书写。例如,villin2 应该写作 villin2。 大小写: 对于真核生…