我想知道这是否真的是错误或意图,但无论如何。

为什么转储单个值总是包括显式的 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/

10-16 06:14