YAML 文件中的数字键

Numeric keys in YAML files

有什么方法可以将 YAML 文件中的数字键字符串化吗?我有一个示例输入文件:

foo: bar
123: New York
food: Cheese
23.61 : max_value

我正在使用 ruamel 包来处理我的文件 - 加载或转储调用中是否有任何可用的东西可以执行转换,所以它看起来像:

foo: bar
'123': New York
food: Cheese
'23.61' : max_value

甚至所有的键...

'foo': bar
'123': New York
'food': Cheese
'23.61': max_value

我查看了 API 但没有看到任何明显的东西...

没有使所有键都成为字符串的加载选项,但您可以在加载后使用一个小的递归函数来做到这一点:

import sys
import ruamel.yaml

yaml_str = """\
foo: bar
123: New York
food: Cheese
23.61 : max_value
"""

def keys2string(d):
    if isinstance(d, dict):
        for idx, k in enumerate(list(d.keys())):
            if not isinstance(k, str):
                sk = str(k)
                d.insert(idx, str(k), d.pop(k))
                k = sk
            keys2string(d[k])
    elif isinstance(d, list):
        for e in d:
            keys2string(e)


yaml = ruamel.yaml.YAML()
yaml.preserve_quotes = True
data = yaml.load(yaml_str)
keys2string(data)
yaml.dump(data, sys.stdout)

给出:

foo: bar
'123': New York
food: Cheese
'23.61': max_value

使用 .insert() 是保留键顺序的一种可能方法(即用字符串化键代替其原始数字键)。