python常识系列03-->python读取YAML文件

前言

     书是灵魂最好的麻醉剂。——钱伯斯
     我觉得可以把第一个书改为技术!

一、python读取YAML文件步骤

  1. 安装 pyyaml 模块 :pip install pyyaml
  2. 编写代码

二、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()中的其它三个参数不要问,问就是解决中文编码问题,不信你不写试试。
posted @ 2020-03-23 21:23  蓝寅  阅读(605)  评论(0编辑  收藏  举报