强制 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"
我有以下字符串 "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"