gpt4 book ai didi

YAML 文本的 Python 字典不保留字符

转载 作者:太空宇宙 更新时间:2023-11-04 05:15:31 25 4
gpt4 key购买 nike

问题很简单,但要正确措辞有点棘手。

基本上,我有一本包含以下数据的字典:

x = { foo: [1, '\n', 'bar'] }

当我使用带有 yaml.safe_dump(x, default_flow_style=False) 的 pyyaml 转换为 yaml 时,我希望输出为:

foo:
- 1
- '\n'
- bar

但是,我得到了类似的东西

foo:
- 1
- '

'
- bar

换行符实际上被解释而不是作为 '\n' 字符串传递。

我一直在查看 pyyaml 文档,但没有看到正确的咒语来正确解析这个东西。

有没有人以前处理过同样的问题?你是怎么解决的?


为了提供更多的上下文,关于这个。

我有一个要转换为 yaml 的 json。

有这样的文件:

{ 
"content": {
"Fn::Join": ["\n", [{ "Ref": "parentStackName" }, ""]]
}
}

最终结果应该是这样的:

content:
Fn::Join:
- "\n"
- - Ref: parentStackId
- ''

注意 "\n" 只是一个字符串,而不是一个实际的字符。

我使用的程序是:

  1. 打开文件
  2. 将json从文本解析为dict
  3. 使用dict转储到yaml

当我创建字典时,您可以看到“\n”是字符串的一部分。当 pyyaml 将其转储到 yaml 中时,事情就会出错。

最佳答案

要获得所需的输出,您可以使用 ruamel.yaml 的往返功能,并更新 YAML 的 JSON 子集用于 block 样式的流样式:

import sys
import ruamel.yaml
from ruamel.yaml.comments import CommentedMap, CommentedSeq

# because this is a string and not read from file, you need to escape
# the backslash in \n
json_str = """\
{
"content": {
"Fn::Join": ["\\n", [{ "Ref": "parentStackName" }, ""]]
}
}
"""


def block_style(base):
"""set all mapping and sequneces to block-style"""
if isinstance(base, CommentedMap):
for k in base:
block_style(base[k])
base.fa.set_block_style()
if isinstance(base, list):
for item in base:
block_style(item)
base.fa.set_block_style()
return base


data = ruamel.yaml.round_trip_load(json_str)
block_style(data)
ruamel.yaml.round_trip_dump(data, sys.stdout)

给出:

content:
Fn::Join:
- "\n"
- - Ref: parentStackName
- ''

ruamel.yaml 是 PyYAML 的更新版本(免责声明:我是作者)。它支持 YAML 1.2 规范(自 2009 年起),使 YAML 更符合 JSON 的完整超集,并允许您使用 ruamel.yaml 解析器读取 JSON(PyYAML 仅支持大部分 YAML 1.1 规范)。

在“round-trip-mode”中,ruamel.yaml 的增强包括维护流响应。复合节点(映射和序列)的 block 样式(以及各种引用样式、注释和标签名称)。 block_style() 所做的是递归地将“流属性”.fa 更改为所有复合节点的 block 样式。

关于YAML 文本的 Python 字典不保留字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41816541/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com