如何解决将对象转储到Yaml中而不加引号
我有一个要转换为yaml的对象,唯一的是我需要能够在不带引号的情况下放入“!anything”。
当我用pyyaml尝试时,我的yaml文件中最终出现了'!anything'。
我已经尝试使用ruamel.yaml PreservedScalarString和LiteralScalarString。它确实有效,但不是我需要的工作方式。问题是我最终得到的Yaml看起来像这样:
10.1.1.16:
text: '1470814.27'
confidence: |-
!anything
但是我不需要这个|-
符号。
我的目标是要获得这样的Yaml:
10.1.1.16:
text: '1470814.27'
confidence: !anything
有什么想法可以实现这一目标吗?
解决方法
要转储自定义标签,您需要定义一个类型并为该类型注册一个表示符。这是用于标量的方法:
import yaml
class MyTag:
def __init__(self,content):
self.content = content
def __repr__(self):
return self.content
def __str__(self):
return self.content
def mytag_dumper(dumper,data):
return dumper.represent_scalar("!anything",data.content)
yaml.add_representer(MyTag,mytag_dumper)
print(yaml.dump({"10.1.1.16": {
"text": "1470814.27","confidence": MyTag("")}}))
这发出
10.1.1.16:
confidence: !anything ''
text: '1470814.27'
请注意标记后的''
,它是标记的标量(不,您不能摆脱它)。您也可以标记集合,但需要相应地使用represent_sequence
或represent_mapping
。
与@flix注释相反,在YAML中,您不需要在标签后加上单引号或双引号(或块标量)。您可以尝试使用Oren Ben-Kiki的reference parser(以编程方式从YAML规范派生)来确认您的预期输出是有效的YAML。
空内容通常在Python中作为None
加载(已过时的PyYAML和ruamel.yaml)。标记为空的内容当然只能指示特定实例的存在,而没有任何值指示。
ruamel.yaml可以很好地往返您的预期输出:
import sys
from ruamel.yaml import YAML
yaml_str = """\
10.1.1.16:
text: '1470814.27'
confidence: !anything
"""
yaml = YAML()
data = yaml.load(yaml_str)
yaml.dump(data,sys.stdout)
给予:
10.1.1.16:
text: '1470814.27'
confidence: !anything
您可以生成一个对象,该对象仅转储不带任何值的标记(就像解析器一样),但是如果您不想进入细节,可以加载已标记的对象并将其添加到您的数据结构:
import sys
import ruamel.yaml
yaml = ruamel.yaml.YAML()
def tagged_empty_scalar(tag):
return yaml.load('!' + tag)
data = {'10.1.1.16': dict(text='1470814.27',confidence=tagged_empty_scalar('anything'))}
yaml.dump(data,sys.stdout)
您可以在PyYAML中获得完全相同的结果,并且不带引号,但这更加复杂。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。