【问题标题】:JSON to YAML in Python : How to get correct string manipulation?Python 中的 JSON 到 YAML:如何进行正确的字符串操作?
【发布时间】:2019-09-12 12:07:07
【问题描述】:

我正在使用PyYAML library 将 json 转换为 yaml。但是引号会从字符串值中删除,而不应该这样做。它们只能从键中移除。

我使用了带有 yaml 转储功能的 default_flow_style 选项,如下图所示:

import yaml

x = {'name':'Alice','location':'New York', 'profession':'coder'}
yaml.dump(x, default_flow_style=False)

实际结果是:
'location: New York\nname: Alice\nprofession: coder\n'

当想要的结果是:
"location: 'New York'\nname: 'Alice'\nprofession: 'coder'\n"

【问题讨论】:

  • 从 YAML 的角度来看,它们是等价的。引号大多是可选的。
  • 从这个意义上说,整个转换是可选的,因为 YAML 是 JSON 的超集。
  • 有趣。我不知道它们被认为是等效的,并且 YAML 是 JSON 的超集。
  • @LeoE YAML 自 2009 年发布 1.2 版以来一直是 JSON 的超集,但您使用的(过时的)PyYAML 库仅支持 YAML 1.1。
  • 谢谢@Anthon ...这就是我可能感到困惑的地方。我不知道为什么它被认为是python的标准yaml库,即使它已经过时了。

标签: python json yaml


【解决方案1】:

您正在使用的 PyYAML 库并不容易为您提供 种控制。如果多余的话,它会删除原始报价,当你 用它加载然后转储 YAML(1.1 版)。如果你指定 default_style='"' 每个字符串都被引用,包括键。

ruamel.yaml(免责声明:我是那个包的作者)可以做到这一点 一种往返,同时允许您保留您的特定和/或 多余的引号。它的机制这样做,为您提供类型 您可以开箱即用。

感谢 David Fraser 你也可以很容易地使用不带引号的映射键,而其余的都是双引号:

import sys
import ruamel.yaml


def non_quoted_key(self, data):
   if isinstance(data, ruamel.yaml.compat.string_types):
       data = ruamel.yaml.scalarstring.PlainScalarString(data)
   return self.represent_data(data)

x = {'name':'Alice', 'location':'New York', 'profession':'coder'}
yaml = ruamel.yaml.YAML()
yaml.default_flow_style = False
yaml.default_style = '"'
yaml.Representer.represent_key = non_quoted_key
yaml.dump(x, sys.stdout)

给出:

name: "Alice"
location: "New York"
profession: "coder"

【讨论】:

  • 感谢您的帖子!它解决了这个问题(在您确实需要引号的情况下)。如果您是包作者,那很好。其实你的包应该是标准的python yaml库而不是PyYAML。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-26
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多