yaml.dump 中的转换属性不起作用
Transform attribute in yaml.dump is not working
如果我们想改变 yaml.dump 的输出,我们可以使用 tranform 关键字参数。
文档:https://yaml.readthedocs.io/en/latest/example.html
这是 yaml 数据:
metadata:
name: name
alias: alias
它存储在变量x中。
x = 'metadata:\n name: name\n alias: alias\n'
def tr(s):
return s.replace('\n', '\n ') # Want 4 space at each new line
from ruamel.yaml import YAML
from ruamel.yaml.compat import StringIO
yaml = YAML(typ="safe")
yaml.default_flow_style = False
stream = StringIO()
obj = yaml.load(x)
yaml.dump(obj, stream, transform=tr)
print(stream.getvalue())
在 运行 上面的 python 脚本上,得到这个错误:
TypeError: 需要类似字节的对象,而不是 'str'
预期输出:
metadata:
name: name
alias: alias
注意:每行加4个空格
设置的版本详细信息:
Python: 3.7
ruamel.yaml: 0.15.88
好吧,我现在得到了答案。只有 StringIO 有一些问题,因为 YAML() 总是将编码设置为 utf-8(并且 allow_unicode = True)
更改为使用 io 不会带来任何结果。如果你想在 2.7 中写入 StringIO,你必须禁用 utf-8 编码:
即
yaml = YAML(typ="safe")
yaml.default_flow_style = False
stream = StringIO()
yaml.encoding = None
有关更多信息,请访问此票证:https://sourceforge.net/p/ruamel-yaml/tickets/271/
如果我们想改变 yaml.dump 的输出,我们可以使用 tranform 关键字参数。 文档:https://yaml.readthedocs.io/en/latest/example.html
这是 yaml 数据:
metadata:
name: name
alias: alias
它存储在变量x中。
x = 'metadata:\n name: name\n alias: alias\n'
def tr(s):
return s.replace('\n', '\n ') # Want 4 space at each new line
from ruamel.yaml import YAML
from ruamel.yaml.compat import StringIO
yaml = YAML(typ="safe")
yaml.default_flow_style = False
stream = StringIO()
obj = yaml.load(x)
yaml.dump(obj, stream, transform=tr)
print(stream.getvalue())
在 运行 上面的 python 脚本上,得到这个错误: TypeError: 需要类似字节的对象,而不是 'str'
预期输出:
metadata:
name: name
alias: alias
注意:每行加4个空格
设置的版本详细信息:
Python: 3.7
ruamel.yaml: 0.15.88
好吧,我现在得到了答案。只有 StringIO 有一些问题,因为 YAML() 总是将编码设置为 utf-8(并且 allow_unicode = True) 更改为使用 io 不会带来任何结果。如果你想在 2.7 中写入 StringIO,你必须禁用 utf-8 编码:
即
yaml = YAML(typ="safe")
yaml.default_flow_style = False
stream = StringIO()
yaml.encoding = None
有关更多信息,请访问此票证:https://sourceforge.net/p/ruamel-yaml/tickets/271/