强制 YAML 将字符串格式化为带引号的字符串

Force YAML to format string as a quoted string

我有以下字符串 "058" 需要转储到 YAML 中,但是当我进行转储时,它会转换为“数字”。 (没有引号)。所有其他类似数字的字符串似乎都可以正常工作。

yaml.dump({'a': '058'})

returns:

'a: 058\n'

如您所见,该字符串周围没有引号。与另一个数字比较:

yaml.dump({'a': '057'})

returns:

"a: '057'\n"

并且那个在字符串周围有单引号。除了“058”之外,我测试过的所有其他数字都包含引号。

如何强制 YAML 在其周围加上引号?

是字符串。 YAML 中不需要引号;该值不表示八进制数

import yaml
from yaml import CLoader as Loader

yaml.load('a: 058\n', Loader=Loader)
#  {'a': '058'}
type(yaml.load('a: 058\n', Loader=Loader)['a'])
# str

yaml 库中定义了某些正则表达式。当然,它们的目的是解析流行的格式(i.a 八进制数)。导致此行为的确切正则表达式是

[-+]?0[0-7_]+

要处理此问题,您需要添加自定义显式解析器,但请记住,包含超出 0-8 范围的数字的 oct 值将被不正确地解析——就像它们是正确的 oct 值一样。

解决方法如下:

import re
from yaml import dump
from yaml.resolver import Resolver

Resolver.add_implicit_resolver(
    'tag:yaml.org,2002:int',
    re.compile(r'''^([-+]?0[0-9_]+)$''', re.X),
    list('-+0123456789'))

yaml.dump({'a': '058'})

然后你会得到

"a: '058'\n"