【发布时间】:2016-12-28 00:50:00
【问题描述】:
使用ruamel.yaml,我试图获得某种风格的YAML,更具体地说,单行字符串与:在同一行开始,而多行字符串使用折叠标量风格(|/@ 987654325@) 和行被限制为一定数量的字符(自动换行)。
到目前为止,我的尝试深受similar function called walk_tree in the sources 的影响:
#!/usr/bin/env python
import ruamel.yaml
from ruamel.yaml.scalarstring import ScalarString, PreservedScalarString
def walk_tree(base):
from ruamel.yaml.compat import string_types
if isinstance(base, dict):
for k in base:
v = base[k]
if isinstance(v, string_types):
v = v.replace('\r\n', '\n').replace('\r', '\n').strip()
base[k] = ScalarString(v) if '\n' in v else v
else:
walk_tree(v)
elif isinstance(base, list):
for idx, elem in enumerate(base):
if isinstance(elem, string_types) and '\n' in elem:
print(elem) # @Anthon: this print is in the original code as well
base[idx] = preserve_literal(elem)
else:
walk_tree(elem)
with open("input.yaml", "r") as fi:
inp = fi.read()
loader=ruamel.yaml.RoundTripLoader
data = ruamel.yaml.load(inp, loader)
walk_tree(data)
dumper = ruamel.yaml.RoundTripDumper
with open("output.yaml", "w") as fo:
ruamel.yaml.dump(data, fo, Dumper=dumper, allow_unicode=True)
但是我得到了一个例外:ruamel.yaml.representer.RepresenterError: cannot represent an object: …。如果我将 ScalarString 替换为 PreservedScalarString ,我也不例外
那么如何修复我的代码以使其正常工作?
【问题讨论】:
-
对
print的调用将在 0.13.8 中消失,感谢您指出这一点。 -
如果我的回答不能满足您的需求,请通过将其编辑到您的问题中来包含示例输入(如果不同,则输出)YAML 文件。如果你这样做,你不应该输入 EDIT 。发表简短评论,将触发通知。
标签: python yaml ruamel.yaml