通过解析 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'}
我对 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'}