前言
书是灵魂最好的麻醉剂。——钱伯斯
我觉得可以把第一个书改为技术!
一、python读取YAML文件步骤
- 安装 pyyaml 模块 :pip install pyyaml
- 编写代码
二、pyyaml 模块应用
- 2.1 读取YAML文件基础
#存在 test.yml 文件,内容如下:
name: xiaohong
age: 24
books:
- 呐喊
- 朝花夕拾
读取YAML代码如下:
import yaml
file = open('test.yaml', 'r', encoding="utf-8")
#使用文件对象作为参数
data = yaml.load(file)
print(data)
以上代码执行结果如下:
/usr/local/bin/python3.8 /Users/lanyin/PycharmProjects/newdream/app_demo/blog_demo/test_demo_02.py
{'name': 'xiaohong', 'age': 24, 'books': ['呐喊', '朝花夕拾']}
类型: <class 'dict'>
/Users/lanyin/PycharmProjects/newdream/app_demo/blog_demo/test_demo_02.py:6: YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details.
data = yaml.load(file)
Process finished with exit code 0
会出现警告,原因是YAML 5.1版本后弃用了yaml.load(file)这个用法,因为觉得很不安全,5.1版本之后就修改了需要指定Loader,通过默认加载器(FullLoader)禁止执行任意函数,该load函数也变得更加安全。建议代码如下:
import yaml
file = open('test.yaml', 'r', encoding="utf-8")
#读取文件中的所有数据
file_data = file.read()
file.close()
#指定Loader
data = yaml.load(file_data,Loader=yaml.FullLoader)
print(data)
- 上述例子和之前的例子我用了两种不同的读取方式,第一种为文件对象,第二种为文件中的所有字符串数据,两种方法都可以;
- 同时大家也发现了:yaml读取出来的数据结构不是由pyyaml模块读取代码决定的,而是yaml文件中的内容决定了它的结构,比如现在举例的YAML是字典里面嵌套列表,从文件读取出来后,也是这种数据结构形式。
- 2.2 load_all() 方法应用
#存在 test.yml 文件,内容如下:
---
name: xiaoli
age: 22
---
name: xiaohuang
age: 21
load_all()方法使用代码如下:
import yaml
file = open('test.yaml', 'r', encoding="utf-8")
#datas为load_all()方法返回的迭代器对象
datas = yaml.load_all(file,Loader=yaml.FullLoader)
for data in datas:
print(data)
本例中的YAML文件使用 --- 分为两段,load_all()方法会创建一个迭代器对象,分开存放两段数据。
- 2.3 使用dump()方法将一个python对象生成为yaml格式的数据
import yaml
data = { 'name':'xiaowang', 'age':30 , 'sex':'男' }
data_yaml = yaml.dump(data).encode('utf-8').decode('unicode_escape')
print(data_yaml)
以上示例中.encode('utf-8').decode('unicode_escape') 是先编码为'utf-8',然后解码(或称为反编码)成汉字。大家如对此不熟悉,可以逐个去掉.encode('utf-8').decode('unicode_escape') 看显示效果。
- 2.4 使用dump()方法将一个python对象生成yaml格式的文档
import yaml
data = { 'name':'xiaowang', 'age':30 , 'sex':'男' }
yaml_file = open('test.yaml','w')
#yaml_file作为dump()第二个参数,是一个可写状态的文件对象
yaml.dump(data, yaml_file ,default_flow_style=False,encoding='utf-8',allow_unicode=True)
yaml_file.flush()
yaml_file.close()
- 上例中dump()因为要完成写入文件操作,所以需要一个可写状态的文件对象作为参数
- 上述例子会在当前文件目录生成一个test.yaml文件,其中dump()中的其它三个参数不要问,问就是解决中文编码问题,不信你不写试试。