Python中YAML格式处理详解
Python对YAML格式配置文件的处理:
Python可通过pyyaml模块实现YAML文档的解析与生成,该模块官方文档地址为http://pyyaml.org/wiki/PyYAMLDocumentation。
一、YAML数据解析
安全提示:使用yaml.load方法处理不可信来源数据存在潜在风险,该方法与pickle.load具有相同功能,可执行任意Python函数。
yaml.load函数用于将YAML文档转换为Python对象:
import yaml
yaml_content = """
- host
- name
- handle
"""
print(yaml.load(yaml_content, Loader=yaml.FullLoader))
PyYAML 5.1版本后移除默认Loader参数,需显式指定加载器类型。推荐使用FullLoader以避免代码注入风险。
不同Loader类型特性:
- BaseLoader:仅支持基础YAML语法
- SafeLoader:安全加载受限YAML子集
- FullLoader:完整支持YAML语法(当前默认加载器)
- UnsafeLoader:兼容旧版Loader(不建议用于不可信数据)
yaml.load支持多种输入类型,包括字节字符串、文件对象等,自动识别UTF-8/UTF-16编码格式。
示例Ansible playbook文件test.yaml内容:
---
- hosts: webservers
vars:
http_port: 80
max_clients: 200
tasks:
- name: ensure apache is at the latest version
yum: pkg=httpd state=latest
- name: write the apache config file
template: src=/srv/httpd.j2 dest=/etc/httpd.conf
notify:
- restart apache
- name: ensure apache is running
service: name=httpd state=started
handlers:
- name: restart apache
service: name=httpd state=restarted
解析示例:
import yaml
with open("test.yaml", "r", encoding="utf-8") as f:
data = yaml.load(f, Loader=yaml.FullLoader)
print(data)
输出结果为嵌套字典结构,包含hosts、vars、tasks等字段。
处理多文档YAML文件时,可使用yaml.load_all方法:
import yaml
with open("test.yaml", "r", encoding="utf-8") as f:
documents = yaml.load_all(f, Loader=yaml.FullLoader)
for doc in documents:
print(doc.get("hosts"))
二、YAML数据序列化
yaml.dump函数用于将Python对象转换为YAML文档:
import yaml
config_data = {
"name": "anliu",
"age": 18,
"ip": "192.168.42.111",
"host": "DNS"
}
with open("test1.yaml", "w", encoding="utf-8") as f:
yaml.dump(config_data, f)
生成的test1.yaml文件内容如下:
name: anliu
age: 18
ip: 192.168.42.111
host: DNS