gpt4 book ai didi

python - 加载 yaml 字符串时跳过转换实体(使用 PyYAML)

转载 作者:行者123 更新时间:2023-12-01 01:49:16 24 4
gpt4 key购买 nike

在 yaml 包中加载 YAML 字符串时,有没有一种好的方法可以防止实体转换为 python 对象?特别是,我不希望将时间戳字符串转换为日期时间对象。

这是一个例子:

import yaml
yaml.load("""d: 2018-06-17\nn: 42""")

这给出了

{'d': datetime.date(2018, 6, 17), 'n': 42}

但是我想要

{'d': '2018-06-17', n: 42}

其中日期字符串保留为字符串,其他类型已转换。我不想更改输入字符串,例如通过指定特定数据类型。也许有一个替代的 YAML 加载器/解析器包。我正在使用 python3.6 和 PyYAML==3.12。

最佳答案

YAML 有多个模式,由于您在 PyYAML 中使用默认(不安全)加载,您可以获得它支持的 Python 对象的所有构造,包括您想要的 int 构造,以及您不想要的 datetime.time

由于您想要转换整数,因此不能使用基本加载器:

import yaml
data = yaml.load("""d: 2018-06-17\nn: 42""", Loader=yaml.BaseLoader)
print(data)

因为这会在各处提供字符串:

{'d': '2018-06-17', 'n': '42'}

将匹配的日期时间对象作为字符串处理可能是最简单的。在我的 ruamel.yaml 库中,您可以使用以下方法来实现:

import ruamel.yaml

yaml = ruamel.yaml.YAML(typ='safe')
yaml.constructor.yaml_constructors[u'tag:yaml.org,2002:timestamp'] = \
yaml.constructor.yaml_constructors[u'tag:yaml.org,2002:str']
data = yaml.load("""d: 2018-06-17\nn: 42""")
print(data)

如果您只需要支持旧的 YAML 1.1 规范,您可以在 PyYAML 中执行相同的操作:

import yaml
import yaml.constructor
yaml.constructor.SafeConstructor.yaml_constructors[u'tag:yaml.org,2002:timestamp'] = \
yaml.constructor.SafeConstructor.yaml_constructors[u'tag:yaml.org,2002:str']

data = yaml.safe_load("""d: 2018-06-17\nn: 42""")
print(data)

两者都打印:

{'d': '2018-06-17', 'n': 42}

关于python - 加载 yaml 字符串时跳过转换实体(使用 PyYAML),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50900727/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com