将对象转储到不带引号的yaml中

2024-09-29 19:34:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些对象,我想变成yaml,唯一的事情是我需要能够把“!anything”没有引号

当我试着用pyyaml时,我最终得到了'!我的yaml文件里有任何东西

我已经尝试过使用ruamel.yaml PreservedScalarString和literalscalString。这是一种工作方式,但不是我需要的工作方式。问题是我最终得到了yaml,看起来是这样的:

10.1.1.16:
            text: '1470814.27'
            confidence: |-
              !anything

但是我不需要这个|-符号

我的目标是让yaml像这样:

10.1.1.16:
            text: '1470814.27'
            confidence: !anything

有什么办法可以做到吗


Tags: 文件对象textyaml目标方式符号ruamel
2条回答

与@flix comment相反,在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中得到完全相同的结果,并且不使用引号,但这更复杂

要转储自定义标记,需要定义一个类型并为该类型注册一个representer。下面是如何对标量执行此操作:

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_sequencerepresent_mapping

相关问题 更多 >

    热门问题