通过解析 YAML 得到错误的值

Get wrong values by parsing YAML

我对 yaml 解析结果有些困惑。我做了一个test.yaml,结果是一样的

val_1: 05334000
val_2: 2345784
val_3: 0537380
str_1: foobar
val_4: 05798
val_5: 051342123

解析:

import yaml

with open('test.yaml', 'r', encoding='utf8') as f:
    a = yaml.load(f, Loader=yaml.FullLoader)

returns:

{'val_1': 1423360,
 'val_2': 2345784,
 'val_3': '0537380',
 'str_1': 'foobar',
 'val_4': '05798',
 'val_5': 10863699}

为什么 val_1 和 val_5 使用这些值?有什么特别的吗?

在我有很多 yaml 文件的真实数据中,有像 val_1 这样的值。对于一些他们解析正确但对于一些他们不正确?全部以 05 开头,后跟更多数字。由前导 0 引起的结果应该是字符串。但是 yaml 解析的东西完全不同。

如果我将 yaml 读取为文本文件 f.readlines(),一切都很好:

['val_1: 05334000\n',
 'val_2: 2345784\n',
 'val_3: 0537380\n',
 'str_1: foobar\n',
 'val_4: 05798\n',
 'val_5: 051342123\n']

前导 0 的整数被解析为八进制;在 python 中,您需要使用前导 0o:

来编写它们
0o5334000 == 1423360

至于 '0537380':因为有一个 8 作为数字存在,所以它不能被解析为八进制数。因此它仍然是一个字符串。


如果您想获取所有条目的字符串,您可以使用 BaseLoader

from io import StringIO
import yaml

file = StringIO("""
val_1: 05334000
val_2: 2345784
val_3: 0537380
str_1: foobar
val_4: 05798
val_5: 051342123
""")

dct = yaml.load(file, Loader=yaml.BaseLoader)

我得到:

{'val_1': '05334000', 'val_2': '2345784', 'val_3': '0537380', 
 'str_1': 'foobar', 'val_4': '05798', 'val_5': '051342123'}