import sys
from ruamel import yaml
yaml_str = "{'Name': 'Zara', 'Age': 7, 'Class': 'First'}"
data = yaml.round_trip_load(yaml_str)
pos = list(data.keys()).index('Age') # determine position of 'Age'
# insert before position of 'Age'
data.insert(pos, 'Phone', '1234', comment='This is the phone number')
data.fa.set_block_style() # I like block style
yaml.round_trip_dump(data, sys.stdout)
这将始终给予:
Name: Zara
Phone: '1234' # This is the phone number
Age: 7
Class: First
mykeys = ['Name', 'Age', 'Class']
mydict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'} # order doesn't matter
k, v = 'Phone', '123-456-7890'
mykeys.insert(mykeys.index('Name')+1, k)
mydict[k] = v
for k in mykeys:
print(f'{k} => {mydict[k]}')
# Name => Zara
# Phone => 123-456-7890
# Age => 7
# Class => First
一旦您使用了
load()
(没有选项Loader=RoundTripLoader
),并且您的数据位于dict()
中,就要迟到了,因为在YAML文件中可用的顺序通常已经消失(顺序取决于使用的实际键、使用的python(实现、版本和可能的编译选项)。你需要做的是使用
round_trip_load()
:这将始终给予:
在引擎盖下
round_trip_dump()
透明地返回一个orderddict
的子类来实现这一点(实际实现依赖于Python版本)。在python<;3.7(或cpython<;3.6)上,您无法控制标准字典中对的顺序。
如果您计划经常执行任意插入,我的建议是使用列表存储键,使用dict存储值。
如果计划使用内容不太可能更改的顺序初始化词典,则可以使用维护插入顺序的
collections.OrderedDict
结构。注意,
OrderedDict
不支持在任意位置插入(它只记住键插入字典的顺序)。您必须将dict初始化为OrderedDict。创建一个新的空OrderedDict,遍历原始字典的所有键,并在键名匹配时插入before/after。
相关问题 更多 >
编程相关推荐