禁用 PyYAML 值转换

Posted

技术标签:

【中文标题】禁用 PyYAML 值转换【英文标题】:Disable PyYAML value conversion 【发布时间】:2013-01-29 05:35:19 【问题描述】:

我刚刚开始使用PyYAML来转换一些数据。

我只是使用yaml.load 函数,它对我来说已经足够好了,直到我注意到它尝试将所有值转换为统一编码的字符串、int、日期等。

这在我的应用程序中可能是致命的,有没有办法避免这种转换? 我想以字符串的形式接收所有内容。 我查看了构造函数,找不到禁用此转换的方法。

更新: 我从yaml.load 得到的是OrderedDict,一切看起来都很好。唯一的问题是有些值是字符串,有些是整数。我想将所有值都作为字符串。我不希望 pyyaml 为我转换值。

【问题讨论】:

那你不是在解码 YAML。此外,究竟是什么你想留下字符串,什么不?如果你留下 everything 一个字符串,你想要the_file.read() ;-) 我使用pyyaml解析的文件实际上不是yaml,但它足够接近。因此我想避免类型转换。 但是什么类型的转换呢?您想接收列表吗?字典?你想转换布尔值吗?浮动?到任意深度还是固定格式?就目前而言,这太不明确了。 @delnan,请查看更新信息 举个例子,假设你有一个数据结构,其中两个字母的位置代码在历史上被不带引号地放入 YAML,并且你希望位置代码 on不会转换为True 【参考方案1】:

好吧,您可以使用Loader=yaml.BaseLoader 将所有内容都保留为字符串:

>>> x = [[1,2,3], 1:2]
>>> s = yaml.dump(x)
>>> s
'- [1, 2, 3]\n- 1: 2\n'
>>> yaml.load(s)
[[1, 2, 3], 1: 2]
>>> yaml.load(s, Loader=yaml.BaseLoader)
[[u'1', u'2', u'3'], u'1': u'2']

【讨论】:

当心:虽然这确实禁用了自动值转换,但它似乎也导致“ 上测试 这也会导致键和(序列)元素被构造为字符串,而不仅仅是 YAML 文档中的标量值。

以上是关于禁用 PyYAML 值转换的主要内容,如果未能解决你的问题,请参考以下文章

Python的PyYAML模块详解

如何使用 PyYAML 重命名密钥

pyyaml 中的默认构造函数参数

我可以在 yaml/pyyaml 中转储空白而不是 null 吗?

PyYAML文档

为啥致命错误:安装 PyYAML 时找不到“yaml.h”文件?