如何在 Python 中解析 YAML 文件
如何在 Python 中解析 YAML 文件?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
如何在 Python 中解析 YAML 文件?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(10)
不依赖 C 头文件的最简单、最纯粹的方法是 PyYaml(文档),可以通过 安装>
pip install pyyaml
:就是这样。也存在普通的 yaml.load() 函数,但应始终首选 yaml.safe_load() 以避免引入任意代码执行的可能性。因此,除非您明确需要任意对象序列化/反序列化,否则请使用
safe_load
。请注意,PyYaml 项目支持 YAML 1.1 规范 之前的版本。如果需要 YAML 1.2 规范 支持,请参阅 ruamel.yaml 如此答案中所述。
另外,您还可以使用 pyyaml 的替代品,使您的 yaml 文件保持与您拥有的方式相同的顺序,称为 oyaml。在此处查看 oyaml 的 Synk
The easiest and purest method without relying on C headers is PyYaml (documentation), which can be installed via
pip install pyyaml
:And that's it. A plain
yaml.load()
function also exists, butyaml.safe_load()
should always be preferred to avoid introducing the possibility for arbitrary code execution. So unless you explicitly need the arbitrary object serialization/deserialization usesafe_load
.Note the PyYaml project supports versions up through the YAML 1.1 specification. If YAML 1.2 specification support is needed, see ruamel.yaml as noted in this answer.
Also, you could also use a drop in replacement for pyyaml, that keeps your yaml file ordered the same way you had it, called oyaml. View synk of oyaml here
阅读&使用 Python 2+3(和 unicode)编写 YAML 文件
创建的 YAML 文件
常见文件结尾
.yml
和.yaml
替代方案
对于您的应用程序,以下因素可能很重要:
请参阅:数据序列化格式的比较
如果您正在寻找一种制作配置文件的方法,您可能需要阅读我的短文Python 中的配置文件
Read & Write YAML files with Python 2+3 (and unicode)
Created YAML file
Common file endings
.yml
and.yaml
Alternatives
For your application, the following might be important:
See also: Comparison of data serialization formats
In case you are rather looking for a way to make configuration files, you might want to read my short article Configuration files in Python
如果您的 YAML 符合 YAML 1.2 规范(2009 年发布),那么您应该使用 ruamel.yaml (免责声明:我是该包的作者)。
它本质上是 PyYAML 的超集,支持大部分 YAML 1.1(从 2005 年开始)。
如果您希望能够在往返时保留您的评论,那么您当然应该使用 ruamel.yaml。
升级 @Jon 的示例很简单:
使用
safe_load()
除非您确实完全控制输入、需要它(很少情况)并且知道您在做什么。如果您使用 pathlib
Path
来操作文件,则最好使用 ruamel.yaml 提供的新 API:If you have YAML that conforms to the YAML 1.2 specification (released 2009) then you should use ruamel.yaml (disclaimer: I am the author of that package).
It is essentially a superset of PyYAML, which supports most of YAML 1.1 (from 2005).
If you want to be able to preserve your comments when round-tripping, you certainly should use ruamel.yaml.
Upgrading @Jon's example is easy:
Use
safe_load()
unless you really have full control over the input, need it (seldom the case) and know what you are doing.If you are using pathlib
Path
for manipulating files, you are better of using the new API ruamel.yaml provides:首先使用 pip3 安装 pyyaml。
然后导入 yaml 模块并将文件加载到名为“my_dict”的字典中:
这就是您所需要的。现在整个 yaml 文件都在“my_dict”字典中。
First install pyyaml using pip3.
Then import yaml module and load the file into a dictionary called 'my_dict':
That's all you need. Now the entire yaml file is in 'my_dict' dictionary.
要访问 YAML 文件中列表的任何元素,如下所示:
您可以使用以下 python 脚本:
To access any element of a list in a YAML file like this:
You can use following python script:
示例:
Example:
我使用 ruamel.yaml。
详细信息& 此处进行辩论。ruamel.yaml 的用法与旧用法兼容(有一些简单的可解决问题) PyYAML ,正如我提供的链接中所述,使用
代替
,它将解决您的大多数问题。
编辑:事实证明,PyYAML 并没有消亡,它只是维护在不同的地方。
I use ruamel.yaml.
Details & debate here.Usage of ruamel.yaml is compatible (with some simple solvable problems) with old usages of PyYAML and as it is stated in link I provided, use
instead of
and it will fix most of your problems.
EDIT: PyYAML is not dead as it turns out, it's just maintained in a different place.
我建议使用 pyyaml 库以及内置的 pathlib 库。
您需要首先构建一个
pathlib.Path
对象:这适用于现代版本的 Python 3。
您不需要以这种方式使用
open
文件方法。该代码稍微简洁一些,您可以在实际尝试解析 YAML 文件之前轻松检查该文件是否存在。I would suggest to use the
pyyaml
library, together with the in-builtpathlib
library.You will need to build a
pathlib.Path
object first:This works fine with modern versions of Python 3.
You do not need with use the
open
file method this way. The code is a slightly more concise and you can easily check if the file exists, before you actually try to parse the YAML file.我为此制作了自己的脚本。只要保留归属信息,就可以随意使用它。该脚本可以从文件中解析yaml(函数
load
),从字符串中解析yaml(函数loads
)并将字典转换为yaml(函数dumps
)代码>)。它尊重所有变量类型。示例
config.yml
输出
I made my own script for this. Feel free to use it, as long as you keep the attribution. The script can parse yaml from a file (function
load
), parse yaml from a string (functionloads
) and convert a dictionary into yaml (functiondumps
). It respects all variable types.Example
config.yml
Output
read_yaml_file 函数将所有数据返回到字典中。
read_yaml_file function returning all data into a dictionary.