文章目录
YAML文件介绍
1.1 yaml语法介绍
yaml文件是用来方便读写的一种格式。它实质上是一种通用的数据串行话格式。
它的基本语法如下:
- 大小写敏感
- 缩进表示层级关系
- 缩进时不允许使用Tab,仅允许空格
- 空格的多少不重要,关键是相同层级的元素要对齐
- #表示注释,#后面的字符都会被忽略
- 在单一档案中,可用连续三个连字号(——)区分多个档案。
另外,还有选择性的连续三个点号( … )用来表示档案结尾
yaml支持的数据格式包括:
- 字典
- 数组
- 纯量:单个的,不可再次分割的值
1.1.1 对象(字典)
对象是一组组的键值对,使用冒号表示结构
url: http://www.baidu.com
log:
file_name: test.log
backup_count: 5
1234
yaml也允许另外一种写法,将所有的键值对写成一个行内对象
log: {file_name: test.log, backup_count: 5}
1
1.1.2 数组
一组横线开头的行,组成一个数组。
- cat
- Dog
- Goldfish
123
转换成python对象是
['cat', 'Dog', 'Goldfish']
1
数组也可以采用行内写法:
animal: [cat, dog]
1
转行成python对象是
{'animal': ['cat', 'dog']}
1
1.1.3 纯量
纯量是最基本,不可分割的值。
数字和字符串直接书写即可:
number: 12.30
name: zhangsan
12
布尔值用true和false表示
isSet: true
flag: false
12
null用~表示
parent: ~
1
yaml允许用两个感叹号表示强制转换
e: !!str 123
f: !!str true
12
1.1.4 引用
锚点&和别名*,可以用来引用
defaults: &defaults
adapter: postgres
host: localhost
development:
databases: myapp_deveploment
<<: *defaults
test:
databases: myapp_test
<<: *defaults
1234567891011
等同于以下代码
defaults:
adapter: postgres
host: localhost
development:
databases: myapp_deveploment
adapter: postgres
host: localhost
test:
databases: myapp_test
adapter: postgres
host: localhost
12345678910111213
&用来建立锚点(defaults),<<表示合并到当前数据,*用来引用锚点
下面是另外一个例子:
- &abc st
- cat
- dog
- *abc
1234
转换成python代码是:
['st', 'cat', 'dog', 'st']
1.2 使用python操作yaml
1.2.1 安装依赖包
pip install pyyaml
1.2.2 获取数据
- yaml文件如下
# config.yaml
user_info :
name : zhangsan
age : 18
gender : 男
is_admin : true
---
connect :
host : 127.0.0.1
user : db
password : 123456
port : 1521
db : zet
...
- 示例代码:
import yaml
# 获取yaml文件路径
yamlPath = 'config.yaml'
with open(yamlPath, 'rb') as f:
file_data = f.read()
data = yaml.safe_load_all(file_data)
# salf_load_all方法得到的是一个迭代器,需要使用list()方法转换为列表
print(list(data))
# [{'user_info': {'name': 'zhangsan', 'age': 18, 'gender': '男', 'is_admin': True}},
# {'connect': {'host': '127.0.0.1', 'user': 'db', 'password': 123456, 'port': 1521, 'db': 'zet'}}]
1.2.3 修改数据
- 示例代码:
data1 = [
{
'name': 'lisi',
'age': 18,
'roles': ['admin', 'sys_admin']
},
{
'name': 'wangwu',
'age': 20,
}
]
save_path = 'config1.yaml'
with open(save_path, 'w') as f:
yaml.dump(data1, f)
- 输出结果:
- age: 18
name: lisi
roles:
- admin
- sys_admin
- age: 20
name: wangwu
1.2.4 封装工具类
import yaml
class YAMLHelper(object):
@staticmethod
def read_from_yaml(path):
with open(path, 'rb') as f:
file_data = f.read()
# yaml文件通过---分节,多个节组合成一个列表
data = yaml.safe_load_all(file_data)
return list(data)
@staticmethod
def write_to_yaml(path, data):
with open(path, 'w') as f:
yaml.dump(data, f)
1.2.5 调用举例
- config.yaml
# config.yaml
user_info :
name : zhangsan
age : 18
gender : 男
is_admin : true
---
connect :
host : 127.0.0.1
user : db
password : 123456
port : 1521
db : zet
...
- 示例代码
# 读取
yaml_path = 'config.yaml'
print(YAMLHelper.read_from_yaml(yaml_path))
# [{'user_info': {'name': 'zhangsan', 'age': 18, 'gender': '男', 'is_admin': True}},
# {'connect': {'host': '127.0.0.1', 'user': 'db', 'password': 123456, 'port': 1521, 'db': 'zet'}}]
data1 = [
{
'name': 'zhaoliu',
'age': 18,
'roles': ['admin', 'sys_admin']
},
{
'name': 'wangwu',
'age': 20,
}
]
save_path = 'config1.yaml'
YAMLHelper.write_to_yaml(save_path, data1)