我想知道这是否真的是错误或意图,但无论如何。
为什么转储单个值总是包括显式的 YAML 结束?
import sys
from ruamel.yaml import YAML
yaml=YAML()
yaml.explicit_end=False
yaml.dump(1, sys.stdout)
生产
1
...
…
可以以某种方式轻松跳过吗? 最佳答案
添加文档结束标记( ...
)的原因是因为
number 被转储为根级别的普通标量
文档。如果您转储一个字符串(假设该字符串
可以在没有引号的情况下转储而不会被误解,即字符串
由数字组成,只需要引用就不会被看到
作为整数)。
没有文档结束标记,从流加载时,解析器
不知道文档是否完整,或者流是否正在等待填充。
文档结束标记消除了这种歧义,所以这是故意的,但例如在解析文件(而不是通用流)时,这可以并且将通过检查文件结尾来完成。
有几种方法可以解决这个问题,一种是转换输出:
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)
这使:
abc
以上应该也适用于多个文档的
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)
这也给出了:
abc
关于python - Yaml end ("...") 即使 yaml.explicit_end=False 也总是转储,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56950391/