【问题标题】:Keep the "dictionary as string" format when serializing序列化时保持\"dictionary as string\"格式
【发布时间】:2022-10-14 15:40:25
【问题描述】:

我必须使用以下 YAML 文件:

HEADER:
  properly_formated_section:
    ..
  config:
    value1: {value: 1, id: 0}
    value2: {value: 2, id: 1}

当反序列化,然后序列化(仅使用 yaml)时,我获得以下内容:

HEADER:
  properly_formated_section:
    ..
  config:
    value1:
      - value: 1
        id: 0
    value2:
      - value: 2
        if: 1

这会给我之后使用该文件的软件带来麻烦,因此我需要保持“字典为字符串”的格式。

到目前为止,我能做的最好的事情是:

HEADER:
  properly_formated_section:
    ..
  config:
    value1: '{"value": 1, "id": 0}'
    value2: '{"value": 2, "id": 1}'

在这种情况下,添加的单引号和双引号会导致问题。

是否有一个简单的解决方案可以将其保留在原始文件中,不带引号?该解决方案只需要关注config 键,而别管其他人。

【问题讨论】:

  • 你的字典不是一个字符串,它是一个对象(除了最后一个例子,它有未指定的问题)。这两种 YAML 形式是等价的,所以如果您遇到“问题”之后的软件,它就无法真正处理 YAML。
  • 这两种语法在 YAML 中是等价的。使用该文件的软件已损坏,应该教您如何正确解析 YAML。 (这是原则性答案,不一定是实际答案;))
  • 我同意你的观点,但我无法修复软件(yaml 文件实际上有无效标签,我需要在反序列化之前删除并在序列化之后替换......)

标签: python yaml


【解决方案1】:

假设您使用“just yaml”指示 PyYAML,您不应该使用它 用于更新 YAML 文档。它仅支持 YAML 1.1 的一个子集(YAML 1.2 规范于 2009 年发布), 并且不擅长保留与人类(和修订控制系统)相关的细节,例如 样式、cmets、锚名称等。

您应该使用 ruamel.yaml 代替(免责声明:我是该软件包的作者):

import sys
import ruamel.yaml
import yaml as pyyaml

yaml_str = """
HEADER:
  properly_formated_section:
    a: |
       some text
    seq:
    - 1
    - 42   # thanks DA
    b: 'more text'
    c: "even more text"
    [1, 5]: PyYAML cannot handle this, even though it is even valid YAML 1.1

  config:
    value1: {value: 1, id: 0}
    value2: {value: 2, id: 1}
"""

yaml = ruamel.yaml.YAML()
yaml.preserve_quotes = True
data = yaml.load(yaml_str)
yaml.dump(data, sys.stdout)
print('-----------')

try:
    pyyaml.safe_load(yaml_str)
except Exception as e:
    print('PyYAML execepted on input')

这使:

HEADER:
  properly_formated_section:
    a: |
      some text
    seq:
    - 1
    - 42   # thanks DA
    b: 'more text'
    c: "even more text"
    [1, 5]: PyYAML cannot handle this, even though it is even valid YAML 1.1

  config:
    value1: {value: 1, id: 0}
    value2: {value: 2, id: 1}
-----------
PyYAML execepted on input

如您所见,ruamel.yaml 保留了原始布局并毫无问题地引用, 只需要设置.preserve_quotes 来保留现有的引号(所有这些 在这个输入中是多余的)。

您所说的“字典为字符串”格式,在 YAML 用语中称为“流式映射”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 2013-01-16
    相关资源
    最近更新 更多