Python PyYAML包的用法(附带实例)
PyYAML 是一个用于解析和生成 YAML 数据的第三方 Python 包,它可以完成 Python 数据与 YAML 数据的相互转换。
本文中 PyYAML 的版本是 6.0 版本。PyYAML 的安装命令是:
PyYAML 还提供了 safe_load_all() 函数,可以将多文档的 YAML 文件转换为 Python 数据,它的参数与 safe_load() 完全一致,返回结果是生成器对象。
读者可以使用 for 循环遍历生成器中的成员。YAML 的数据量一般不是很大,也可以将其强制转换为 list 列表类型来访问其中的数据。使用 safe_load_all() 函数将 YAML 数据转换为 Python 数据,代码示例如下:
demo2.yml中的内容如下:
通过 dump() 函数可将 Python 数据转换为 YAML 数据。读者需要掌握以下4个参数:
使用 dump() 函数将 Python 数据转换为 YAML 数据并写入文件,代码如下:
本文中 PyYAML 的版本是 6.0 版本。PyYAML 的安装命令是:
pip install pyyaml==6.0需要注意的是,PyYAML 在 Python 代码中导入的包名是 yaml。
YAML数据转换为Python数据
YAML 数据一般被保存在 YAML 文件中,为了演示 PyYAML,需要创建一个文件名为 demo.yml 的 YAML 文件,其内容可参考如下的代码:device: name: netdevops01 ip: 192.168.137.1 vendor: 华为 online: true rack: '0101' start_u: 20 end_u: 21 interface_usage: 0.67 interfaces: - eth1/1 - eth1/2 - eth1/3 uptime: null使用 yaml 模块中的 safe_load() 函数,可以将指定的 YAML 文件安全地转换为 Python 数据,这个函数只有 stream 一个参数,需要将其赋值为文本文件对象。使用 safe_load() 函数将 YAML 数据转换为 Python 数据,代码如下:
import yaml with open('demo.yml', encoding='utf8') as f: data = yaml.safe_load(stream=f) print(data)
PyYAML 还提供了 safe_load_all() 函数,可以将多文档的 YAML 文件转换为 Python 数据,它的参数与 safe_load() 完全一致,返回结果是生成器对象。
读者可以使用 for 循环遍历生成器中的成员。YAML 的数据量一般不是很大,也可以将其强制转换为 list 列表类型来访问其中的数据。使用 safe_load_all() 函数将 YAML 数据转换为 Python 数据,代码示例如下:
import yaml with open('demo2.yml', encoding='utf8') as f: data = yaml.safe_load_all(f) data = list(data) print(data)
demo2.yml中的内容如下:
# this is a play list --- - name: play 01 host: huawei_devs - name: play 02 host: huawei_devs --- - name: play 01 host: cisco_devs - name: play 02 host: cisco_devs
Python数据转换为YAML数据
Python 基础数据对象可以转换为 YAML 格式,并保存到文件中。YAML 更适合人工编写,然后由程序解析,通过程序生成 YAML 文件的场景相对较少,因此读者了解其基本使用方法即可。通过 dump() 函数可将 Python 数据转换为 YAML 数据。读者需要掌握以下4个参数:
- data:Python 的数据对象。
- stream:导出的文本文件对象。
- allow_unicode:默认值为 None,当 Python 数据中有汉字时,务必将其值设置为 True,这样在 YAML 文件中才会显示为汉字。
- sort_keys:是否根据对象 key 进行排序,建议将其赋值为 False,保证原有的顺序。
使用 dump() 函数将 Python 数据转换为 YAML 数据并写入文件,代码如下:
import yaml python_data = {'device': {'name': 'netdevops01', 'ip': '192.168.137.1', 'vendor': '华为', 'online': True, 'rack': '0101', 'start_u': 20, 'end_u': 21, 'interface_usage': 0.67, 'interfaces': ['eth1/1', 'eth1/2', 'eth1/3'], 'uptime': None} } with open('dump_demo.yml', mode='w', encoding='utf8') as f: yaml.dump(python_data, stream=f, allow_unicode=True, sort_keys=False)