ruamel.yaml是否支持保留反斜杠换行符?解析异常咨询
ruamel.yaml 是否支持保留反斜杠换行符?
问题场景
- 用SnakeYaml导出的文本包含回车符
\r\n,由于换行和长度限制,这些字符被拆分成带反斜杠的续行形式(行尾加\实现换行)。
原YAML文件示例:
--- items: - description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmode\ \ ut labore et dolore magna aliqua.\r\n\r\nUt enim ad minim veniam, quis nost. \r\ \n \r\n\r\nDuis aute irure dolor in reprehenderit in voluptate velit esse cillum dol\ \ nulla pariatur.\r\n\r\nExcepteur sint occaecat cupidatat non proident, sunt ."
复现脚本
使用ruamel.yaml读取并写入该文件的测试脚本:
from ruamel.yaml import YAML # 创建YAML实例 yaml = YAML() # 读取YAML文件 with open('example.yaml', 'r') as file: data = yaml.load(file) # 可在此修改data,示例: # data['new_key'] = 'new_value' # 将修改后的数据写入新文件 with open('example_modified.yaml', 'w') as file: yaml.dump(data, file) print("YAML文件读取并写入成功。")
问题现象
执行脚本后,原文件中的反斜杠续行符丢失,导致\r\n被错误拆分,文件对比差异如下:
❯ python ./parser_yaml.py YAML文件读取并写入成功。 ❯ diff example_modified.yaml example.yaml 0a1 > --- 2,6c3,6 < - description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmode < ut labore et dolore magna aliqua.\r\n\r\nUt enim ad minim veniam, quis nost. \r < \n \r\n\r\nDuis aute irure dolor in reprehenderit in voluptate velit esse cillum < dol nulla pariatur.\r\n\r\nExcepteur sint occaecat cupidatat non proident, sunt < ." --- > - description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmode\ > \ ut labore et dolore magna aliqua.\r\n\r\nUt enim ad minim veniam, quis nost. \r\ > \n \r\n\r\nDuis aute irure dolor in reprehenderit in voluptate velit esse cillum dol\ > \ nulla pariatur.\r\n\r\nExcepteur sint occaecat cupidatat non proident, sunt ."
这会导致解析结果异常:
原文件解析结果(使用yq命令):
❯ yq '.items[0].description' example.yaml Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmode ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nost. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dol nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt .
修改后文件解析结果:
❯ yq '.items[0].description' example_modified.yaml Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmode ut labore et dolore magna aliqua. t enim ad minim veniam, quis nost. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dol nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt .
解决方案
ruamel.yaml默认会自动处理续行反斜杠,若要保留原有的反斜杠换行格式,需调整以下配置:
- 启用
preserve_quotes选项,确保字符串的引号和内部格式不被修改; - 设置足够大的
width值,避免自动拆分长字符串; - 调整缩进规则,匹配原文件格式。
修改后的脚本:
from ruamel.yaml import YAML # 创建YAML实例并配置 yaml = YAML() yaml.preserve_quotes = True # 保留原字符串的引号和格式 yaml.width = 1000 # 设置极大行宽,避免自动换行 yaml.indent(mapping=2, sequence=4, offset=2) # 匹配原文件的缩进规则 # 读取YAML文件 with open('example.yaml', 'r') as file: data = yaml.load(file) # 写入文件 with open('example_modified.yaml', 'w') as file: yaml.dump(data, file) print("YAML文件读取并写入成功,已保留原反斜杠换行格式。")
配置说明:
preserve_quotes:禁止ruamel.yaml修改原字符串的引号类型和内部结构;width:通过设置超大行宽,阻止自动拆分长字符串,从而保留原有的反斜杠续行结构;- 缩进配置:对齐原文件的缩进规则,保证输出格式一致。
调整后导出的YAML文件会完整保留原反斜杠换行符,解析结果与原文件一致。
内容的提问来源于stack exchange,提问作者Steve-B
相关产品推荐
相关产品推荐

