讲师中心 微信公众号
AI工具推荐 视频效率加速

Python ruamel.yaml 的保留注释解析

落静吖_5613

落静吖_5613

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

|

455人浏览过

|

来源于php中文网

原创

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

python ruamel.yaml 的保留注释解析

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

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

必须显式设置 preserve_quotes=True 和 default_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 模式下的节点类型(如 CommentedMap、CommentedSeq)才带这些能力。

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

实操建议:

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

示例:

python 查询技能
python 查询技能

查询客流数据,输出JSON格式,可直接导入Bitable等可视化工具

下载
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大模型工具。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

相关专题

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

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

2095

2023.08.07

json是什么
json是什么

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

3142

2023.08.23

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

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

1056

2023.10.13

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

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

3559

2025.09.10

append用法
append用法

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

598

2023.10.25

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

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

1476

2023.11.14

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

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

2444

2025.09.12

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

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

550

2025.09.05

剧云AI短剧创作教程合集
剧云AI短剧创作教程合集

本专题聚焦剧云AI短剧创作,讲解从短剧灵感、梗概、全局大纲到分集、分场和正文的完整流程及节奏设计方法。

0

2026.10.14

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn