使用ruamel.yaml我试图获得某种样式的YAML,更具体地说,单行字符串与:
在同一行开始,多行字符串使用折叠标量样式(|
/|-
),行数限制为一定数量的字符(单词换行)。在
到目前为止,我的尝试深受similar function called ^{
#!/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
,就像原来的walk_tree
代码一样,我也没有例外,但是我又得到了不是我想要的文本块。在
那么,如何修复我的代码,使其正常工作呢?在
类
ScalarString
是LiteralScalarString
的基类,正如您所发现的,它没有representer。您应该将它作为一个Python字符串,因为它适当地处理特殊字符(引用需要引用的字符串以符合YAML规范)。在假设您有这样的输入:
你可能想做些类似的事情:
^{pr2}$要获得输出:
^{3}$注意事项:
LiteralScalarString
优于PreservedScalarString
。后者称之为当时唯一保留下来的字符串类型的残余。在preserve_literal
,尽管它仍然在复制的代码中使用。在data[1]['abc']
作为LiteralScalarString
加载。如果您想保留现有的文字样式字符串标量,您应该在测试string_types
类型之前测试这些标量。在YAML()
的实例一起使用width
属性设置为1000之类的值,以防止自动换行。(yaml.width = 1000
)相关问题 更多 >
编程相关推荐