尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
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进行路径拼接并根据需求灵活使用过滤逻辑可以高效解决绝大多数目录遍历问题。
RELATED

相关推荐

从weapp-example学小程序架构:提升开发效率的7个技巧

从weapp-example学小程序架构:提升开发效率的7个技巧

从weapp-example学小程序架构:提升开发效率的7个技巧 【免费下载链接】weapp-example 项目地址: https://gitcode.com/gh_mirrors/we/weapp-example weapp-example是一个微信小程序示例项目,通过学习该项目的架构设计,开发者可以掌握…

📅 2026/9/15 11:41:30
5大创新特性:Diva Mod Manager如何彻底改变《初音未来》模组管理体验

5大创新特性:Diva Mod Manager如何彻底改变《初音未来》模组管理体验

5大创新特性:Diva Mod Manager如何彻底改变《初音未来》模组管理体验 【免费下载链接】DivaModManager 项目地址: https://gitcode.com/gh_mirrors/di/DivaModManager 作为《初音未来:歌姬计划 Mega Mix》玩家的终极模组管理解决方案&#xff0c…

📅 2026/9/8 10:30:43
AI 赋能网络安全领域深度剖析

AI 赋能网络安全领域深度剖析

目录 引言:AI 正在重塑网络安全的攻防格局 AI 在网络安全领域的应用全景图 成熟应用:已经大规模落地的 AI 安全能力 成长应用:正在快速发展但仍需调试的 AI 安全能力 前沿探索:尚处于研究或早期试点的 AI 安全能力 AI 在网络…

📅 2026/9/9 7:54:14
MORE NEWS

更多资讯

📰

milkdown 斜杠插件 @milkdown/plugin-slash 完全指南:从 SlashProvider 到 slashFactory 的源码级解析

milkdown 斜杠插件 milkdown/plugin-slash 完全指南:从 SlashProvider 到 slashFactory 的源码级解析 【免费下载链接】milkdown 🍼 Plugin driven WYSIWYG markdown editor framework. 项目地址: https://gitcode.com/GitHub_Trending/mi/milkdown …

📰

EIP-7686 深度解析:线性 EVM 内存限制,为 N Gas 执行建立 N 字节内存硬上限

EIP-7686 深度解析:线性 EVM 内存限制,为 N Gas 执行建立 N 字节内存硬上限 【免费下载链接】EIPs The Ethereum Improvement Proposal repository 项目地址: https://gitcode.com/GitHub_Trending/ei/EIPs 导读 EIP-7686(Linear EVM…

📰

PHP打造仿Win10 UI系统:前后端数据契约与窗口管理器实现

简介:WIN10-UI是一套仿Windows 10界面的PHP后台UI源码,专为需要快速搭建个性化后台管理界面的开发者设计。采用动态磁贴、桌面图标自动排序、任务栏与iframe子窗口联动、开始菜单及消息通知中心,整体交互贴近原生Windows系统,同时…

📰

UE4动态河流实现:Fluid Flux插件从基础原理到交互实战

UE4项目里做水体,一直是又爱又恨的环节。这几年我在开放世界和数字孪生项目里都碰过水体需求,官方Water系统、各种纯材质方案也都试过,直到朋友推荐了Fluid Flux,我才第一次觉得河流是真的可以“动起来”的。这个河流流体插件做的…

📰

View Transitions API实战:告别SPA路由切换的生硬与白屏

最近在给手上的 SPA 项目做页面切换动画优化,调研了一圈才发现,浏览器原生已经出了一套叫 View Transitions API 的方案,可以直接接管 DOM 更新过程的动画过渡。这篇文章就是我在实际项目里从了解到落地,再到处理各种坑的一份完整…

📰

平板数据备份实战指南:从应急抢救到三地四重长效防护

1. 平板故障不是数据终点,而是备份意识的起点“平板坏了数据怎么办?”——这句搜索背后,藏着无数人手忙脚乱翻找充电线、反复重启、对着黑屏发呆的瞬间。我见过太多案例:美术生临展前平板突然无法唤醒,三年手稿全在本地…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬