如何格式化 YAML 以包含括号作为不带引号的值之一

Posted

技术标签:

【中文标题】如何格式化 YAML 以包含括号作为不带引号的值之一【英文标题】:How to format YAML to include bracket as one of the value without quotes 【发布时间】:2021-08-02 12:46:09 【问题描述】:

我正在使用 python3 yaml 包从字典中编写 yaml,例如:

main1:
  aa:
    val1: [ ]
  bb:
  - val2: xxxxxxx
    val3: [1]

但我无法超越。 一切都在得到:

main1:
  aa:
    val1: '[ ]'
  bb:
  - val2: xxxxxxx
    val3: '[1]'

我的代码sn-p:

yaml.dump_all(data, f, default_flow_style=False, sort_keys=False)

我想要的只是删除列表元素周围的单引号 保持其他与上面提到的相同,我已经在各种博客和堆栈溢出答案中进行了搜索,对我没有任何帮助,有什么帮助吗? 我用yaml.dump(data,f, default_flow_style=None, sort_keys=False) 做字典:

data = 
    'main1': 
        'aa': 
            'val1': [],
            'check1':'check2':1
        ,
        'bb': [
          'val2': 'xxxxxxx',
          'val3': [1],
        ],
    ,

它将按预期工作括号,但嵌套字典格式不按预期。

main1:
  aa:
    val1: []
    check1: check2: 1
  bb:
  - val2: xxxxxxx
    val3: [1]

预期:

main1:
  aa:
    val1: []
    check1: 
        check2: 1
  bb:
   - val2: xxxxxxx
     val3: [1]

【问题讨论】:

不是解决方案而是解决方法,我可以通过以文本模式打开文件来实现这一点,而不是应用正则表达式并再次以 yaml 形式写入。 f = open("1.yaml", "r") t = f.read() import re print(t) tmp = re.sub("'[", "[", t) print(t) f = open("2.yaml", "w") f.write(tmp) f.close() 不可能告诉 YAML 处理器删除引号,因为 [] 括号是 YAML 中的语法元素。您也不会期望在以 JSON 格式编写文件时可以做到这一点,对吧? @ruohola 我想我理解得很好。 '[1]' 是 YAML 中的 3 个字符的字符串,而 [1] 是一个包含一个项目的序列,数字 1,写在紧凑的 flow style 中。我是 YAML 核心团队的成员,也是链接教程的作者。 @ShubhamChauhan 请创建一个minimal reproducible example。您的问题缺少您正在使用的 python 代码。 @tinita ... 今天的咖啡太少了。我很抱歉。 【参考方案1】:

以下代码为我返回您想要的输出(第 3 行中 [] 之间缺少空格除外):

import yaml

data = 
    'main1': 
        'aa': 
            'val1': []
        ,
        'bb': [
          'val2': 'xxxxxxx',
          'val3': [1],
        ],
    ,


print(yaml.dump(data, default_flow_style=None, sort_keys=False))

输出:

main1:
  aa:
    val1: []
  bb:
  - val2: xxxxxxx
    val3: [1]

你没有展示你是如何创建数据字典的,所以我只是在这里猜测。

【讨论】:

您添加了第二个数据示例和第二个输出,但不清楚您的预期输出是什么。它按预期工作。如果default_flow_style 设置为None,则没有嵌套字典和列表的字典和列表将以流样式转储。无法使用 pyyaml 进一步自定义。

以上是关于如何格式化 YAML 以包含括号作为不带引号的值之一的主要内容,如果未能解决你的问题,请参考以下文章

YAML语法

打印不带括号和逗号的数组

yaml 格式

YAML语法

带和不带引号和括号的 setTimeout 之间的区别

YAML语法