多字典字符串转YAML遇文档起始错误:ruamel.yaml问题排查
多字典字符串转YAML的问题解决
核心问题分析
你遇到的报错本质是原始多字典字符串的格式完全不合法,不管是Python语法还是YAML语法都存在严重问题:
- 嵌套单引号未转义:比如
'{p_d: '{a:3...}'}这种写法,在Python里本身就是语法错误,ruamel.yaml根本无法识别正确的结构。 - 集合格式误用:
vec_mode:'{2.5, ...}'里的大括号在YAML中是集合类型,但你这里明显是想表示数值列表,格式不符合YAML规范。 - 多文档分隔错误:YAML多文档需要用
---分隔,但你的原始字符串只是两个错误格式的字典直接换行,加---也无法修复底层的格式问题。
单字典能正常转换只是巧合——外层多了一对单引号让Python把整个内容当成一个字符串,ruamel.yaml勉强能解析里面的结构,但这种写法本身也不规范。
解决步骤
1. 修正原始字符串格式
先把每个顶级字典的内容调整为合法的YAML格式:
- 把嵌套的单引号全部去掉,改用YAML支持的无引号键(或给键加双引号)。
- 把数值集合
'{2.5, ...}'改成列表[2.5, ...](如果确实是集合,YAML需要用!!set标记,但列表更符合常规需求)。 - 转义字符串里的双引号(比如
mfn:\"bbbb.txt\"保留转义,或改成单引号包裹mfn:'bbbb.txt')。
修正后的两个字典字符串示例:
dict1_str = "{p_d: {a:3, what:3.6864e-05, s:lion, vec_mode:[2.5, -2.9, 3.4, 5.6, -8.9, -5.67, 2, 2, 2, 2, 5.4, 2, 2, 6.545, 2, 2], sst:{c:-20, b:6, p:panther}}}" dict2_str = "{mgbp: {ifftp: {ipdp: {ipdncf: {r_t:no, mfn:'bbbb.txt', r_s:-967901775, np:-1187634210}}}}}"
2. 使用ruamel.yaml的dump_all输出多文档YAML
ruamel.yaml提供dump_all方法专门处理多文档场景,自动添加---分隔符:
import ruamel.yaml yaml = ruamel.yaml.YAML() # 加载修正后的两个字典 dict1 = yaml.load(dict1_str) dict2 = yaml.load(dict2_str) # 输出到文件 with open('output.yaml', 'w', encoding='utf-8') as f: yaml.dump_all([dict1, dict2], f)
最终输出的YAML格式
p_d: a: 3 what: 3.6864e-05 s: lion vec_mode: - 2.5 - -2.9 - 3.4 - 5.6 - -8.9 - -5.67 - 2 - 2 - 2 - 2 - 5.4 - 2 - 2 - 6.545 - 2 - 2 sst: c: -20 b: 6 p: panther --- mgbp: ifftp: ipdp: ipdncf: r_t: no mfn: bbbb.txt r_s: -967901775 np: -1187634210
关键注意点
- 不要手动拼接错误格式的字典字符串,尽量直接构造Python字典对象再转YAML,能避免大部分格式问题。
- 如果必须从原始字符串转换,一定要先清理引号、修正集合/列表格式,确保每个字典字符串能被ruamel.yaml正常加载。
内容的提问来源于stack exchange,提问作者Vimo
相关产品推荐
相关产品推荐

