gpt4 book ai didi

python - 在 python 中对 YAML block 映射序列进行排序

转载 作者:太空宇宙 更新时间:2023-11-03 17:21:37 26 4
gpt4 key购买 nike

我正在尝试按照我想要的方式对 YAML block 映射序列进行排序...我想要类似的东西

depth: !!opencv-matrix
rows: 480
cols: 640
dt: f
data: 'x'

但每次我转储时,它都会变成

cols: 640
data: 'x'
depth: !!opencv-matrix
dt: f
rows: 480

我在这里检查了一种简单易行的方法

ordering = ['ymlFile','depth', 'rows', 'cols', 'dt', 'data']
ordered_set = [{'depth': '!!opencv-matrix'}, {'rows' : depthSizeImg[0]}, {'cols' : depthSizeImg[1]}, {'dt' : type(img_d[0][0])}, {'data': ymlList.tolist()}]]

f = open(out_d, 'a')
f.write('%YAML:1.0 \n')
f.write(yaml.dump(data, default_flow_style=None, allow_unicode=False, indent = 4))
f.close()

但是它使得 YAML 不是以嵌套的方式。

%YAML:1.0 
- {depth: '!!opencv-matrix'}
- {rows: 323}
- {cols: 110}
- {dt: !!python/name:numpy.float32 ''}
- {data: 'x'}

如何获得正确的输出?

最佳答案

在你的例子中

ordered_set = [{'depth': '!!opencv-matrix'}, {'rows' : depthSizeImg[0]}, {'cols' : depthSizeImg[1]}, {'dt' : type(img_d[0][0])}, {'data': ymlList.tolist()}]]

您正在转储一个字典列表,这就是您得到的 YAML 输出。调用列表 ordered_set 不会使其成为一个集合,并且在数据中包含 YAML 标记(那些 !!object_name 条目)也不会更改它们。

YAML specification使用 !!omap (示例 2.26),它将序列的有序结构与单个键映射结合起来作为元素:

depth: !!omap
- rows: 480
- cols: 640
- dt: f
- data: x

如果你将其读入 PyYAML,你会得到:

{'depth': [('rows', 480), ('cols', 640), ('dt', 'f'), ('data', 'x')]}

这意味着您无法通过简单的关键字查找来获取rows的值。如果你将上面的内容转储到 YAML,你会得到更丑陋的结果:

depth:
- !!python/tuple [rows, 480]
- !!python/tuple [cols, 640]
- !!python/tuple [dt, f]
- !!python/tuple [data, x]

如果不定义从!!omap到ordereddict实现和vv的映射,你就无法使用PyYAML解决这个问题。

您需要的是一个针对您的 YAML 的更智能的“转储器”:

import ruamel.yaml as yaml

yaml_str = """\
depth: !!omap
- rows: 480
- cols: 640
- dt: f
- data: x
"""

data1 = yaml.load(yaml_str)
data1['depth']['data2'] = 'y'
print(yaml.dump(data1, Dumper=yaml.RoundTripDumper))

给出:

depth: !!omap
- rows: 480
- cols: 640
- dt: f
- data: x
- data2: y

或者将其与智能加载程序结合起来(它不会丢弃输入中存在的排序信息),并且您可以省略 !!omap:

import ruamel.yaml as yaml

yaml_str = """\
depth:
- rows: 480
- cols: 640 # my number of columns
- dt: f
- data: x
"""

data3 = yaml.load(yaml_str, Loader=yaml.RoundTripLoader)
print(yaml.dump(data3, Dumper=yaml.RoundTripDumper))

给出:

depth:
- rows: 480
- cols: 640 # my number of columns
- dt: f
- data: x

(包括保留的评论)。

<小时/>

¹ 这是使用 ruamel.yaml 完成的我是其中的作者。你应该能够如果要在 PyYAML 中使用 data1 进行一些努力,则如果没有对 PyYAML 进行重大增强,则无法完成另一个示例,这正是 ruamel.yaml 的内容。

关于python - 在 python 中对 YAML block 映射序列进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33084900/

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