jor*_*rel 7 python yaml ruamel.yaml
我想知道这是否真的是错误或意图,但无论如何。
\n\n为什么转储单个值总是包含显式 YAML 结尾?
\n\nimport sys\nfrom ruamel.yaml import YAML\nyaml=YAML()\nyaml.explicit_end=False\nyaml.dump(1, sys.stdout)\nRun Code Online (Sandbox Code Playgroud)\n\n生产
\n\n1\n...\nRun Code Online (Sandbox Code Playgroud)\n\n可以\xe2\x80\xa6以某种方式轻松跳过吗?
添加文档结束标记 ( ) 的原因是该数字在文档的根级别...转储为普通标量。如果您转储字符串,也会发生同样的情况(假设可以在不带引号的情况下转储字符串而不会被误解,即仅由数字组成的字符串必须加引号,以免被视为整数)。
如果没有文档结束标记,从流加载时,解析器将不知道文档是否完整,或者流是否正在等待填充。文档结束标记消除了这种歧义,因此这是有意为之,但是例如在解析文件(而不是通用流)时,也可以并且将会通过检查文件结尾来完成。
有几种方法可以解决这个问题,其中一种是转换输出:
import sys
import ruamel.yaml
def strip_document_end_marker(s):
if s.endswith('...\n'):
return s[:-4]
yaml = ruamel.yaml.YAML()
yaml.dump("abc", sys.stdout, transform=strip_document_end_marker)
Run Code Online (Sandbox Code Playgroud)
这使:
abc
Run Code Online (Sandbox Code Playgroud)
上面的内容也适用dump_all于多个文档(最后一个是根级纯标量)。
open_ended实现此目的的另一种方法是在写入纯值后重置属性:
import sys
import ruamel.yaml
yaml = ruamel.yaml.YAML()
def wp(self, *args, **kw):
self.write_plain_org(*args, **kw)
self.open_ended = False
yaml.Emitter.write_plain_org = yaml.Emitter.write_plain
yaml.Emitter.write_plain = wp
yaml.dump("abc", sys.stdout)
Run Code Online (Sandbox Code Playgroud)
这也给出:
abc
Run Code Online (Sandbox Code Playgroud)