0

0

Python ruamel.yaml 的保留注释解析

舞夢輝影

舞夢輝影

发布时间:2026-02-17 14:48:03

|

395人浏览过

|

来源于php中文网

原创

必须使用 yaml(typ='rt') 或 yaml(typ='round_trip') 才能保留注释,yaml() 默认 typ='safe' 不支持;加载后注释存于节点的 ca 属性,需用同一实例 dump 才能正确输出。

python ruamel.yaml 的保留注释解析

ruamel.yaml 加载时注释消失?默认不保留

默认用 ruamel.yaml.YAML() 实例加载 YAML,即使文件里有行内注释或块注释,解析后 dictCommentedMap 里也看不到——因为底层没启用注释保留模式。

必须显式设置 preserve_quotes=Truedefault_flow_style=False 还不够,核心是:要使用 YAML(typ='rt')YAML(typ='round_trip')

常见错误现象:yaml.load(f, Loader=yaml.RoundTripLoader) 这种旧写法在新版本已弃用,直接报 AttributeError: module 'ruamel.yaml' has no attribute 'RoundTripLoader'

  • YAML(typ='rt') 是最简且推荐的写法,“rt” 即 round-trip
  • 别用 YAML()(默认 typ='safe'),它压根不支持注释保留
  • 如果后续要 dump 回带注释的 YAML,必须用同一个 YAML 实例 load 和 dump

怎么安全读取并保留所有注释?

关键不是“读取”,而是“让节点记住注释位置”。ruamel.yaml 把注释存在节点对象的隐藏属性里(比如 ca 属性),只有 round-trip 模式下的节点类型(如 CommentedMapCommentedSeq)才带这些能力。

立即学习Python免费学习笔记(深入)”;

实操建议:

  • 始终用 yml = YAML(typ='rt') 创建实例,不要复用 safebase 类型
  • yml.load(f),不是 yaml.load(f, ...) —— 后者调的是 PyYAML,和 ruamel.yaml 的注释机制无关
  • 加载后检查注释是否在:打印 data.ca.items(对 map)或 data.ca.comment(对节点),非空说明注释已捕获

示例:

NoCode
NoCode

美团推出的零代码应用生成平台

下载
yml = YAML(typ='rt')
with open('config.yaml') as f:
    data = yml.load(f)
# 此时 data 是 CommentedMap,注释信息藏在 data.ca 中

dump 时注释错位或丢失?顺序和节点类型是关键

注释不会自动“粘”在某个 key 上——它绑定在具体节点对象上。如果你手动构造 dict 再 dump,或者用 dict(data) 转成原生字典,注释就彻底丢了。

常见错误场景:

  • data['host'] = 'new.example.com' 后直接 yml.dump(data, f) —— 只要没动注释相关属性,通常还能保留;但若中间做了 json.loads(json.dumps(data)) 这类操作,节点全换掉了
  • data.get('ports', []).append(8080),结果新增项没注释,原有注释还在老位置,视觉上“错位”
  • dump 到 StringIO 或 bytes 流时,忘了设 yml.default_flow_style = False,导致格式崩坏,注释挤到行尾甚至被截断

性能提示:round-trip 模式比 safe 慢约 2–3 倍,但只要不是高频解析千行 YAML,感知不明显。

注释内容含中文或特殊字符,编码出问题?

不是 ruamel.yaml 的锅,是 Python 文件打开方式不对。默认 open(...) 在 Windows 下可能用 cp1252,Linux/macOS 默认 UTF-8,但若文件声明了 # -*- coding: utf-8 -*- 或 BOM,行为又不同。

稳妥做法:

  • 统一用 open('f.yaml', encoding='utf-8') 显式指定编码
  • 避免依赖系统 locale;BOM 文件可被正确识别,但不建议依赖它
  • 如果 dump 出来注释变成 \u4f60\u597d,说明你用了 json.dumps() 中转过,而不是走 yml.dump()

容易被忽略的一点:注释里的缩进空格数,会被严格保留。如果原始 YAML 用 2 空格缩进写注释,dump 出来不会自动转成 4 空格——这既是优点也是坑,改格式前先确认是否真要动注释位置。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

442

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

544

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

322

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

81

2025.09.10

append用法
append用法

append是一个常用的命令行工具,用于将一个文件的内容追加到另一个文件的末尾。想了解更多append用法相关内容,可以阅读本专题下面的文章。

347

2023.10.25

python中append的用法
python中append的用法

在Python中,append()是列表对象的一个方法,用于向列表末尾添加一个元素。想了解更多append的更多内容,可以阅读本专题下面的文章。

1078

2023.11.14

python中append的含义
python中append的含义

本专题整合了python中append的相关内容,阅读专题下面的文章了解更多详细内容。

178

2025.09.12

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

75

2025.09.05

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

283

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 4.3万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号