python遍历目录os.walk()
os.walk()是 Python 标准库os模块中用于遍历目录树的核心函数。它通过生成器Generator的方式递归地访问指定路径下的所有子目录和文件是处理文件系统批量操作如搜索、统计、重命名、删除等最高效且常用的工具之一。以下从工作原理、参数详解、返回值结构、典型应用场景及注意事项五个方面进行详细解释。1. 核心工作原理os.walk()的本质是一个‌目录树遍历生成器‌。‌递归遍历‌它会自动深入每一个子目录直到遍历完整个目录树。‌内存友好‌作为生成器它不会一次性将所有文件路径加载到内存中而是“按需”逐层 yield 数据。这使得它在处理包含数十万甚至上百万文件的超大目录时依然能保持极低的内存占用。‌遍历顺序‌支持“自上而下”Top-down和“自下而上”Bottom-up两种遍历策略。2. 函数签名与参数详解函数原型如下os.walk(top, topdownTrue, onerrorNone, followlinksFalse)参数类型默认值说明‌top‌str/path-like必传需要遍历的根目录路径。‌topdown‌boolTrue‌遍历方向‌。-True先处理当前目录再处理子目录自上而下。-False先处理最深层的子目录最后回溯到根目录自下而上/后序遍历。注若需修改dirs列表以跳过某些子目录必须使用默认的True。‌onerror‌callableNone‌错误处理函数‌。当遍历过程中遇到权限不足或目录不存在等错误时会调用此函数。该函数接收一个OSError实例作为参数。若未指定错误会被忽略或抛出异常终止遍历。‌followlinks‌boolFalse‌是否跟随符号链接‌。-True访问指向目录的软链接Symbolic Links。-False不跟随软链接。警告若目录中存在循环引用的软链接设置为True可能导致无限循环。3. 返回值结构os.walk()每次迭代会返回一个三元组(root, dirs, files)‌root‌ (str)当前正在遍历的目录的‌完整路径‌。‌dirs‌ (list)当前目录下所有‌子目录的名称列表‌不包含路径仅文件名。重要特性如果topdownTrue你可以就地修改这个列表例如使用dirs.remove()或切片赋值os.walk()将不会进入被移除的子目录。这是实现“跳过特定文件夹”的关键机制。‌files‌ (list)当前目录下所有‌非目录文件的名称列表‌不包含路径仅文件名。‌注意‌dirs和files中的名称都是相对当前root的basename‌不是完整路径‌。获取文件完整路径时必须使用os.path.join(root, name)进行拼接。4. 典型应用场景与代码示例场景一基础遍历打印所有文件路径这是最常见的用法用于查看目录结构或收集文件列表。import os path ./project # 替换为你的目标路径 for root, dirs, files in os.walk(path): for filename in files: # 必须使用 os.path.join 拼接完整路径避免手动拼接斜杠导致的跨平台问题 file_path os.path.join(root, filename) print(file_path)场景二按后缀名筛选文件如查找所有 .py 文件结合字符串方法endswith()进行过滤。import os def find_files_by_extension(root_dir, extension): py_files [] for root, dirs, files in os.walk(root_dir): for file in files: if file.endswith(extension): py_files.append(os.path.join(root, file)) return py_files # 使用示例 python_files find_files_by_extension(./src, .py) print(python_files)场景三跳过特定目录优化性能利用topdownTrue时修改dirs列表的特性跳过.git、node_modules或__pycache__等无需遍历的目录显著提升遍历速度。import os exclude_dirs {.git, node_modules, __pycache__, venv} for root, dirs, files in os.walk(./project): # 原地修改 dirs 列表移除需要排除的目录 # os.walk 在 topdownTrue 时会根据修改后的 dirs 决定下一步进入哪些子目录 dirs[:] [d for d in dirs if d not in exclude_dirs] for file in files: print(os.path.join(root, file))场景四批量重命名或移动文件结合shutil模块可以实现文件的批量处理。import os import shutil source_dir ./old_logs target_dir ./archived_logs if not os.path.exists(target_dir): os.makedirs(target_dir) for root, dirs, files in os.walk(source_dir): for file in files: if file.endswith(.log): src_path os.path.join(root, file) dst_path os.path.join(target_dir, file) # 简单示例移动文件 shutil.move(src_path, dst_path) print(fMoved: {src_path} - {dst_path})5. 进阶注意事项与最佳实践‌路径拼接安全‌‌错误做法‌root / file或root \\ file。这在 Windows 和 Linux 混用或路径末尾有无斜杠时容易出错。‌正确做法‌始终使用os.path.join(root, file)。Python 3.4 也可以使用pathlib.Path(root) / file。‌避免在遍历中修改目录结构‌如果在遍历过程中删除或移动了当前正在遍历的目录或其父目录可能会导致os.walk()行为不可预测或抛出异常。建议先收集所有路径遍历结束后再统一执行删除或移动操作。‌topdown的选择‌如果需要‌删除目录树‌建议使用topdownFalse。因为删除父目录前必须先删除其子内容自下而上的遍历顺序天然符合这一逻辑。如果需要‌剪枝跳过子目录‌必须使用topdownTrue。‌符号链接风险‌除非明确知道目录结构中没有循环引用否则不要随意设置followlinksTrue否则程序可能陷入死循环。‌性能考量‌os.walk()底层基于os.scandir()Python 3.5比旧的os.listdir()效率更高因为它能一次性获取文件属性而无需额外的系统调用。对于海量文件遍历它是首选方案。总结os.walk()是 Python 文件处理的瑞士军刀。掌握其核心在于理解三元组返回值的含义以及利用topdown参数和dirs列表的可变性来控制遍历流程。在实际开发中配合os.path.join进行路径拼接并根据需求灵活使用过滤逻辑可以高效解决绝大多数目录遍历问题。

相关新闻

Linux设备与存储精读 · L02-02 | inode 与目录项:名字、元数据、数据分别在哪

Linux设备与存储精读 · L02-02 | inode 与目录项:名字、元数据、数据分别在哪

模块:L02 文件、路径与元数据 篇号:L02-02 / 38 预计阅读:40 分钟 主线:Linux 设备与存储 文章目录本篇目标30 秒速览正文1. 为什么不能把「文件」想成一团东西2. inode:元数据住在这里3. 目录项:名字住在这…

2026/10/17 18:19:49 阅读更多 →
Windows 11终极优化指南:3分钟让你的系统重获新生

Windows 11终极优化指南:3分钟让你的系统重获新生

Windows 11终极优化指南:3分钟让你的系统重获新生 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and custom…

2026/10/16 19:17:55 阅读更多 →
宇信科技与硅基流动达成战略合作,加速金融智能化升级

宇信科技与硅基流动达成战略合作,加速金融智能化升级

AI 在金融行业规模化落地过程中,面临算力部署的复杂性、模型推理的性价比、以及业务场景适配等现实挑战。金融行业对安全、稳定与合规的严苛要求,更使得底层基础设施的成熟度直接决定了 AI 落地的天花板。基于对这一产业痛点的共同判断,宇信科…

2026/10/17 19:24:44 阅读更多 →

最新新闻

folium地图资源本地化指南:彻底解决离线/内网JS/CSS加载失败

folium地图资源本地化指南:彻底解决离线/内网JS/CSS加载失败

简介:面向使用地图可视化组件、希望摆脱远程加载缓慢问题的开发者,这份打包内容包含前端依赖的完整静态文件,包括核心地图库、交互脚本、界面框架、图表字体等资源,以及配套的样式源文件和地图标记图片,共77个文件&…

2026/10/18 1:22:43 阅读更多 →
EmulatorJS 版本选择指南:Stable、Latest、Nightly 三个渠道怎么选对

EmulatorJS 版本选择指南:Stable、Latest、Nightly 三个渠道怎么选对

EmulatorJS 版本选择指南:Stable、Latest、Nightly 三个渠道怎么选对 【免费下载链接】EmulatorJS A web-based frontend for RetroArch 项目地址: https://gitcode.com/GitHub_Trending/em/EmulatorJS 选 EmulatorJS 版本(一个基于网页的 RetroA…

2026/10/18 1:22:43 阅读更多 →
AI接管终端:架构师为何把命令行当成主战场?

AI接管终端:架构师为何把命令行当成主战场?

1. 一个反直觉的现象:越资深,越把终端当主战场1.1 我观察到的"倒挂"最近一段时间,AI编辑器几乎是所有技术社区里最热的话题。智能补全、对话式生成、自动重构,听起来每一招都能把生产力拉满。可我在观察周围团队之后发现…

2026/10/18 1:22:43 阅读更多 →
ComfyUI-LTXVideo 实战上手:用 LTX-2 从文字和图片生成带声音的视频

ComfyUI-LTXVideo 实战上手:用 LTX-2 从文字和图片生成带声音的视频

ComfyUI-LTXVideo 实战上手:用 LTX-2 从文字和图片生成带声音的视频 【免费下载链接】ComfyUI-LTXVideo LTX-Video Support for ComfyUI 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-LTXVideo ComfyUI-LTXVideo 是 ComfyUI(节点式…

2026/10/18 1:22:43 阅读更多 →
GLM-4.7-W8A8C8推理调优实战:KV Cache int8量化、202K长上下文与专家路由性能优化技巧

GLM-4.7-W8A8C8推理调优实战:KV Cache int8量化、202K长上下文与专家路由性能优化技巧

【免费下载链接】GLM-4.7-W8A8C8 项目地址: https://ai.gitcode.com/hf_mirrors/vllm-ascend/GLM-4.7-W8A8C8 点击查看 免费下载 GLM-4.7-W8A8C8 是面向 vLLM-Ascend(昇腾 NPU 推理框架)发布的 GLM-4.7 MoE 大模型 int8 量化推理版本&#x…

2026/10/18 1:22:43 阅读更多 →
贴片式组合导航模块:智能汽车高精度定位的量产新范式

贴片式组合导航模块:智能汽车高精度定位的量产新范式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 1:21:43 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →