在块样式 yaml 文件 (ruamel.yaml) 中显示来自 Python 的列表作为流样式
Display a list from Python as flow style inside a block style yaml file (ruamel.yaml)
我正在使用 ruamel.yaml 从 Python 字典创建 YAML 文件。在字典中,有一个列表作为 'type' 键的值。我一整天都在寻找示例来解决我的问题,但在文档中找不到任何内容。
我一直在尝试获取这样的 YAML 文件输出:
some_key:
- id: 1059
parameter: Paramter1
unit: kg
type: [A, B, C, 1, 2, 3]
这意味着 type 之后的列表是块样式中的流式元素,这是我切换到 ruamel.yaml
的实际原因,因为我读到它可能与 PyYAML ().但是在那里我找不到我想做什么。
当我打电话时我(不出所料)得到了什么
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)
首先你需要将数字定义为数字,而不是字符串,才能得到
那些未引用的输出( 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
倾销并使用“正常”列表。但这会影响所有其他“叶节点”
列表和听写也是如此。
我正在使用 ruamel.yaml 从 Python 字典创建 YAML 文件。在字典中,有一个列表作为 'type' 键的值。我一整天都在寻找示例来解决我的问题,但在文档中找不到任何内容。
我一直在尝试获取这样的 YAML 文件输出:
some_key:
- id: 1059
parameter: Paramter1
unit: kg
type: [A, B, C, 1, 2, 3]
这意味着 type 之后的列表是块样式中的流式元素,这是我切换到 ruamel.yaml
的实际原因,因为我读到它可能与 PyYAML (
当我打电话时我(不出所料)得到了什么
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)
首先你需要将数字定义为数字,而不是字符串,才能得到
那些未引用的输出( 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
倾销并使用“正常”列表。但这会影响所有其他“叶节点”
列表和听写也是如此。