从JSON到YAML的Python:如何获取正确的字符串操作?

时间:2019-04-23 10:14:57

标签: python json yaml

我正在使用PyYAML library将json转换为yaml。但是引号在不应删除的情况下从字符串值中删除。只能从钥匙中将其删除。

我已将default_flow_style选项与yaml dump函数一起使用,如下所示:

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"

1 个答案:

答案 0 :(得分: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"