1. Yaml 介绍及安装
-
Yaml 介绍
Yaml 是一种所有编程语言可用的友好的数据序列化标准。语法和其他高阶语言类似,并且可以简单表达字典、列表和其他基本数据类型的形态。语法规则如下:
- 大小写敏感。
- 使用缩进表示层级关系。
- 使用空格键缩进,而非Tab键缩进
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可。
- 文件中的字符串不需要使用引号标注,但若字符串包含有特殊字符则需用引号标注;
- 注释标识为#
- 官网:https://yaml.org/
-
Yaml 安装
$ pip3 install PyYaml
-
Yaml 快速体验
-
字典
{"name": "test_yaml", "result", "success"}
写成Yaml
的形式,并输出结果结构通过空格缩进来展示。列表里的项用"-“来代表,字典里的键值对用”:"分隔.
-
示例函数:
data.yaml
name: "test_yaml" result: "success"
demo.py
import yaml with open("./data.yaml",'r') as f: data = yaml.safe_load(f) print(data)
-
运行结果
{'name': 'test_yaml', 'result': 'success'}
-
2 .Yaml 字典和列表介绍
2.1 字典
- 字典里的键值对用":"分隔.
示例: {"name": "test_yaml", "result", "success"}
name: "test_yaml"
age: "success"
总结:
- 字典直接写key和value,每一个键值对占一行。
:
后面要有空格
2.2 列表
- 一组按序排列的值(简称 “序列或列表”)
- 数组前加有 “-” 符号,符号与值之间需用空格分隔
示例:["a", "b", "c"]
- "a"
- "b"
- "c"
- 列表中的元素需要用
-
来表示 - 每一个元素前面都有一个
-
,后面接元素内容
3 Yaml 字典和列表基本操作
3.1 字典
嵌套字典
-
需求
{ person1: { "name": "xiaoming", "age": "18" }, person2: { "name": "xiaohong", "age": "20" } }
-
示例
person1: name: "xiaoming" age: "18" person2: name: "xiaohong" age: "20"
-
结果
{'person1': {'name': 'xiaoming', 'age': '18'}, 'person2': {'name': 'xiaohong', 'age': '20'}}
3.2 字典
嵌套列表
-
需求
{person: ["1", "2", "3"]}
-
示例
persion: - "1" - "2" - "3"
-
结果
{'person': ['1', '2', '3']}
3.3 列表
嵌套字典
-
需求
[{ "username1": "test1" }, { "password1": "111", "username2": "test2", "password2": "222" }]
-
示例
- username1: "test1" - password1: "111" username2: "test2" password2: "222"
-
结果
[{'username1': 'test1'}, {'password1': 111, 'username2': 'test2', 'password2': 222}]
3.4 列表
嵌套列表
-
需求
[["a","b","c"],["1","2","3"]]
-
示例
- - "a" - "b" - "c" - - "1" - "2" - "3"
-
结果
[['a', 'b', 'c'], [1, 2, 3]]
注意:
- pycharm会自动将yaml中的tab转化成空格。但是不能复制”tab键“,不会进行转化。
- 同级别左侧必须要对齐,少个空格无所谓。
4 读取 Yaml 文件
4.1 读取单个Yaml文档
-
yaml文档
#data.yaml "用户名称": "test123" "密码": "123456"
-
示例函数:demo.py 中文问题(windows): encoding=‘utf-8’
import yaml # 打开要读取的文件,中文 encoding='utf-8' with open("./data.yaml", 'r', encoding='utf-8') ) as f: # 加载文件内容 data = yaml.safe_load(f) # 打印结果 print(data)
读取实际上就是先使用 with open 的形式获取文件对象,再使用 yaml 中的 load 方法加载这个文件对象,通过过load方法,一个字符串变成了一个字典
-
结果
{'用户名称': 'test123', '密码': '123456'}
4.2 读取多个Yaml文档
多个文档在一个yaml文件,使用 — 分隔方式来分段
-
yaml文档
-
--- "用户名称1": "test123" "密码": "123456" --- "用户名称2": "test456" "密码": "123456"
-
示例
-
import yaml with open("./data.yaml",'r') as f: data = yaml.safe_load_all(f) for i in data: print(i)
-
结果
-
{'用户名称1': 'test123', '密码': '123456'} {'用户名称2': 'test456', '密码': '123456'}
5 yaml封装
import os
import yaml
#1、创建类
class YamlReader:
#2、初始化,文件是否存在
def __init__(self,yamlf):
if os.path.exists(yamlf):
self.yamlf = yamlf
else:
raise FileNotFoundError("文件不存在")
self._data = None
self._data_all = None
#3、yaml读取
#单个文档读取
def data(self):
#第一次调用data,读取yaml文档,如果不是,直接返回之前保存的数据
if not self._data:
with open(self.yamlf,"rb") as f:
self._data = yaml.safe_load(f)
return self._data
#多个文档读取
def data_all(self):
#第一次调用data,读取yaml文档,如果不是,直接返回之前保存的数据
if not self._data_all:
with open(self.yamlf,"rb") as f:
self._data_all = list(yaml.safe_load_all(f))
return self._data_all