一文弄懂 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模拟与仿真。其中 , 布里渊散射是光波与声波在光纤中传播时相互作用而产生的光散射过程 , 在不 同的条件下 , 布里渊散射又分…

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

问题描述 以下是这个找出字符串中字符串出现频率最多的字符。大家可以自行研究一下,题目不难,我今天尝试使用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 引入的…

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

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

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

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

061、Python 包:模块管理

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

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

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

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

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

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

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

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

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

联邦学习周记|第四周

论文:Active Federated Learning 链接 将主动学习引入FL,每次随机抽几个Client拿来train,把置信值低的Client概率调大,就能少跑几次。 论文:Active learning based federated learning for waste and natural disast…

“Git之道:掌握常用命令,轻松管理代码“

目录 1. 初始化和配置 2. 提交和更新 3. 分支和合并 4. 查看和比较 5. 远程仓库 6. 文件操作命令 1. 初始化和配置 git init:在当前目录初始化一个新的Git仓库git config:配置Git的全局或局部选项git clone:从远程仓库克隆一个本地副本…

vue3第四十节(pinia的用法注意事项解构store)

pinia 主要包括以下五部分,经常用到的是 store、state、getters、actions 以下使用说明,注意事项,仅限于 vue3 setup 语法糖中使用,若使用选项式 API 请直接查看官方文档: 一、前言: pinia 是为了探索 vu…

动手学深度学习(Pytorch版)代码实践 -深度学习基础-11暂退法Dropout

11暂退法Dropout #Dropout 是一种正则化技术,主要用于防止过拟合, #通过在训练过程中随机丢弃神经元来提高模型的泛化能力。 import torch from torch import nn from d2l import torch as d2l import liliPytorch as lpdef dropout_layer(X, dropout):…

大数据—“西游记“全集文本数据挖掘分析实战教程

项目背景介绍 四大名著,又称四大小说,是汉语文学中经典作品。这四部著作历久不衰,其中的故事、场景,已经深深地影响了国人的思想观念、价值取向。四部著作都有很高的艺术水平,细致的刻画和所蕴含的思想都为历代读者所…

0元体验苹果macOS系统,最简单的虚拟机部署macOS教程

前言 最近发现小伙伴热衷于在VMware上安装体验macOS系统,所以就有了今天的帖子。 正文开始 首先,鉴于小伙伴们热衷macOS,所以小白搜罗了一圈macOS系统,并开启了分享通道。 本次更新的系统版本是: macOS 10.13.6 ma…

【靶场搭建】-01- 在kali上搭建DVWA靶机

1.DVWA靶机 DVWA(Damn Vulnerable Web Application)是使用PHPMysql编写的web安全测试框架,主要用于安全人员在一个合法的环境中测试技能和工具。 2.下载DVWA 从GitHub上将DVWA的源码clone到kali上 git clone https://github.com/digininj…

温湿度采集与OLED显示

目录 一、什么是软件I2C 二、什么是硬件I2C 三、STM32CubeMX配置 1、RCC配置 2、SYS配置 3、I2C1配置 3、I2C2配置 4、USART1配置 5、TIM1配置 6、时钟树配置 7、工程配置 四、设备链接 1、OLED连接 2、串口连接 3、温湿度传感器连接 五、每隔2秒钟采集一次温湿…

第二十三篇——香农第二定律(二):到底要不要扁平化管理?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么? 四、总结五、升华 一、背景介绍 对于企业的理解,扁平化的管理,如果从香农第二定律…