gpt4 book ai didi

ruamel.yaml - 使用 Ruamel 插入 key

转载 作者:行者123 更新时间:2023-12-03 22:39:11 25 4
gpt4 key购买 nike

我正在使用 Ruamel Python 库以编程方式编辑人工编辑的 YAML 文件。源文件具有按字母顺序排序的键。

我不确定这是一个基本的 Python 问题还是一个 Ruamel 问题,但是我尝试对 Ruamel 的 OrderedDict 结构进行排序的所有方法对我来说都失败了。

我很困惑,例如,为什么下面的代码基于 this recipe ,不起作用:

import ruamel.yaml
import collections

def read_file(f):
with open(f, 'r') as _f:
return ruamel.yaml.round_trip_load(
_f.read(),
preserve_quotes=True
)

def write_file(f, data):
with open(f, 'w') as _f:
_f.write(ruamel.yaml.dump(
data,
Dumper=ruamel.yaml.RoundTripDumper,
explicit_start=True,
width=1024
))

data = read_file('in.yaml')
data = collections.OrderedDict(sorted(data.items(), key=lambda t: t[0]))
write_file('out.yaml', data)

但鉴于此输入文件:
---
bananas: 1
apples: 2

生成以下输出文件:
--- !!omap
- apples: 2
- bananas: 1

IE。它把我的文件变成了一个 YAML 有序映射。

是否有捷径可寻?另外,我可以以某种方式简单地插入数据结构吗?

最佳答案

如果您在 ruamel.yaml 中往返映射¹ ,映射不会被表示为 collections.OrderedDict() ,它被表示为 ruamel.yaml.comments.CommentedMap() .后者可以是 collections.OrderedDict() 的子类取决于您使用的 Python 版本(例如,在 Python 2 中,它使用来自 ruamel.ordereddict 的更快的 C 实现)

在 round_trip_dump 模式下,代表不会自动将“正常”有序字典(无论是来自 collections 还是 ruamel.ordereddict )解释为特殊的。但是如果你放弃 collections :

import ruamel.yaml

def read_file(f):
with open(f, 'r') as _f:
return ruamel.yaml.round_trip_load(
_f.read(),
preserve_quotes=True
)

def write_file(f, data):
with open(f, 'w') as _f:
ruamel.yaml.dump(
data,
stream=_f,
Dumper=ruamel.yaml.RoundTripDumper,
explicit_start=True,
width=1024
)

data = read_file('in.yaml')
data = ruamel.yaml.comments.CommentedMap(sorted(data.items(), key=lambda t: t[0]))
write_file('out.yaml', data)

您的 out.yaml将会:
---
apples: 2
bananas: 1

请注意,我还删除了您 write_file 中的一个低效率问题。常规。如果不指定流,所有数据将被流式传输到 StringIO实例首先(在内存中)然后返回(您使用 _f.write() 写入流,直接写入流效率更高。

至于您的最后一个问题:是的,您可以使用以下方法插入:
data.insert(1, 'apricot', 3)

¹ 免责声明:我是两者的作者 ruamel.yaml以及 ruamel.ordereddict .

关于ruamel.yaml - 使用 Ruamel 插入 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39307956/

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