如何使用 os.walk() 生成包含目录结构的 UTF-8 编码文本文件
发布时间 - 2026-01-09 00:00:00 点击率:次本文详解如何用 python 的 `os.walk()` 安全遍历含非 ascii 字符(如西里尔文、希腊字母)的路径,并生成正确编码的目录结构文本文件,核心在于显式指定文件写入时的 utf-8 编码。
在使用 os.walk() 生成目录结构树时,若目标路径中存在 Unicode 文件名(例如俄语、希腊语、中文等),原始代码常会抛出 UnicodeEncodeError,典型错误信息如下:
UnicodeEncodeError: 'charmap' codec can't encode characters in position 4-11: character maps to
该异常并非源于 os.walk() 本身——Python 3 中 os.walk() 默认返回 str 类型的 Unicode 路径和文件名(内部以 UTF-8 表示),完全支持多语言字符。真正的问题出在文件写入环节:open(file_name, "w") 在未指定 encoding 参数时,会采用系统默认编码(Windows 上常为 cp1252,Linux/macOS 通常为 utf-8),而 cp1252 等传统编码无法表示绝大多数非拉丁字符,导致写入失败。
✅ 正确解法是:显式声明文件编码为 'utf-8'。修改后的健壮版本如下:
import os
def record_directory_structure(directory_path: str, file_name: str):
# ✅ 关键修复:强制使用 UTF-8 编码写入文件
with open(file_name, "w", encoding='utf-8') as file:
for root, dirs, files in os.walk(directory_path):
# 计算当前目录层级(相对于起始路径)
level = root.replace(directory_path, '').count(os.sep)
indent = ' ' * 4 * level
# 写入目录名(结尾加 '/')
file.write(f'{indent}{os.path.basename(root)}/\n')
# 子项缩进(比目录多一级)
subindent = ' ' * 4 * (level + 1)
# 按字典序排序文件,提升可读性(可选)
for f in sorted(files):
file.write(f'{subindent}{f}\n')? 使用示例:
record_directory_structure(r"C:\my_project", "structure.txt") # 或处理含西里尔文路径: record_directory_structure(r"D:\Проекты\Анализ", "структура.txt")
⚠️ 注意事项:
- 不要尝试对文件名做 encode('utf-8').decode('utf-8') 等无意义的编解码操作——这既不解决写入问题,还可能引入冗余或错误;
若需兼容旧版 Python(- 生成的 .txt 文件可用 VS Code、Notepad++ 或现代系统记事本(启用 UTF-8 检测)正确查看,避免用老旧记事本直接打开(它可能误判编码);
- 如需增强可读性,可对 dirs 和 files 分别排序(例如 sorted(dirs)),使输出结构更稳定。
总结:处理国际化路径的核心原则是——读取靠 os.walk() 自动 Unicode 化,写入靠 open(..., encoding='utf-8') 显式保真。一句代码修正,即可彻底规避编码陷阱。
# linux
# python
# windows
# 编码
# mac
# macos
# win
# 多语言
# vs code
# cos
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
网站优化排名时,需要考虑哪些问题呢?
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
如何在万网开始建站?分步指南解析
Laravel如何使用Blade组件和插槽?(Component代码示例)
如何在云虚拟主机上快速搭建个人网站?
软银砸40亿美元收购DigitalBridge 强化AI资料中心布局
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】
Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
如何快速搭建支持数据库操作的智能建站平台?
如何解决hover在ie6中的兼容性问题
Laravel如何实现密码重置功能_Laravel密码找回与重置流程
Laravel如何实现本地化和多语言支持?(i18n教程)
Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率
🚀拖拽式CMS建站能否实现高效与个性化并存?
Android利用动画实现背景逐渐变暗
制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?
Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践
Laravel中的withCount方法怎么高效统计关联模型数量
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程
Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置
青岛网站建设如何选择本地服务器?
如何在IIS中新建站点并配置端口与IP地址?
如何在自有机房高效搭建专业网站?
如何选择可靠的免备案建站服务器?
浅析上传头像示例及其注意事项
大同网页,大同瑞慈医院官网?
Claude怎样写结构化提示词_Claude结构化提示词写法【教程】
Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】
如何将凡科建站内容保存为本地文件?
详解Huffman编码算法之Java实现
Laravel如何生成API文档?(Swagger/OpenAPI教程)
php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
如何构建满足综合性能需求的优质建站方案?
Laravel怎么上传文件_Laravel图片上传及存储配置
谷歌Google入口永久地址_Google搜索引擎官网首页永久入口
无锡营销型网站制作公司,无锡网选车牌流程?
网站制作报价单模板图片,小松挖机官方网站报价?
为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】
Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】
桂林网站制作公司有哪些,桂林马拉松怎么报名?
Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转
Win11怎么设置默认图片查看器_Windows11照片应用关联设置
Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】


若需兼容旧版 Python(