【问题标题】:Display a list from Python as flow style inside a block style yaml file (ruamel.yaml)在块样式 yaml 文件 (ruamel.yaml) 中将来自 Python 的列表显示为流样式
【发布时间】:2021-06-03 04:21:24
【问题描述】:

我正在使用 ruamel.yaml 从 Python 字典创建 YAML 文件。在字典中,有一个列表作为“类型”键的值。我整天都在寻找解决问题的示例,但在文档中找不到任何内容。

我一直在尝试获得这样的 YAML 文件输出:

 some_key:
  - id: 1059
    parameter: Paramter1
    unit: kg
    type: [A, B, C, 1, 2, 3]

这意味着类型后面的列表是块样式中的流样式元素,这就是我切换到ruamel.yaml 的实际原因,因为我读到它可能与 PyYAML (Mixing block and flow formatting in YAML with Python) 不同。但在那里我找不到我想要做的事情。

当我打电话时我(不出所料地)得到什么

yaml.dump() 

字典上是

some_key:
  - id: 1059
    parameter: Paramter1
    unit: kg
    type:
          - A 
          - B
          - C
          - '1'
          - '2'
          - '3'

有人知道这是如何解决的吗?一个有用的信息可能是也可能不是,相关的列表也可以转换为不同的格式(例如字符串),我从 csv-sheet 中得到它。

更新,这是我一直在尝试的代码示例:

CSV 行如下所示:

"","",Parameter 1,Dropdown,kg,"","","A,B,C,1,2,3"

在conversion.py中类似:

with open(csv_filename, "r") as file:
reader = csv.reader(file)
data = {"some_key": []}
for position, line in enumerate(reader):
        if line[3] == "Dropdown":
            select_options = []
            for item in line[7].split(","):
                select_options.append(item)
            select_options = [x.strip(" ") for x in select_options]
            type = f"{select_options}"
        dict = {
            "id": "tbd",
            "parameter": line[2].strip(" "),
            "unit": line[4].strip(" "),
            "type": type,
        }
        data["some_key"].append(dict)
doc = yaml.dump(data, file)

【问题讨论】:

  • 最好包含一个最小的程序和最小的 CSV 输入,以显示您如何获得输出。这样我们就可以为您提供更直接适用于您的情况的答案。
  • 你是对的。我将它添加到我的原始帖子中,以便可能遇到类似问题的人看到我尝试过的内容
  • 您可以做的一件事是在section_options 中获取数字,因为数字是在附加之前到try:\n item=int(item)\n except ValueError:\n pass。 (将 \n 变成真正的换行符并正确缩进)。
  • 这就是我在您的回复后在我的代码中实际所做的(\n 除外)。感谢您的帮助!

标签: python yaml ruamel.yaml


【解决方案1】:

首先,您需要将数字定义为数字,而不是字符串,以获取 那些未引用的输出(3 而不是'3'

其次你需要调用yaml.indent()作为3个位置的序列缩进 序列分隔符的偏移量为 1,是非标准的。

然后,要精细控制单个列表流样式,您需要将该列表添加为 CommentedSeq 并在其 fa 属性上调用 set_flow_style() 方法:

import sys
import ruamel.yaml

def seq(*l):
    s = ruamel.yaml.comments.CommentedSeq(l)
    s.fa.set_flow_style()
    return s

data = dict(some_key=[{'id': 1059,
                       'parameter': 'Paramter1',
                       'unit': 'kg',
                       'type': seq('A', 'B', 'C', 1, 2 ,3)}])


yaml = ruamel.yaml.YAML()
yaml.indent(mapping=2, sequence=3, offset=1)
yaml.dump(data, sys.stdout)

给出:

some_key:
 - id: 1059
   parameter: Paramter1
   unit: kg
   type: [A, B, C, 1, 2, 3]

在您的示例中,您可以在之前设置 yaml.default_flow_style = None 倾倒并使用“正常”列表。但这会影响所有其他“叶节点” 列表和字典也是如此。

【讨论】:

  • 太棒了!非常感谢,我想我在任何地方都找不到!
猜你喜欢
  • 2016-08-18
  • 2017-09-05
  • 1970-01-01
  • 1970-01-01
  • 2015-07-31
  • 2021-06-09
  • 2019-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多