时间:2020-07-22 python教程 查看: 1000
数据及配置文件之争
数据及文件通常有三种类型:
YAML兼容JSON格式,简洁,强大,灵活,可以很方便的构造层级数据并快速转为Python中的字典。
YAML简介
YAML(YAML Ain't Markup Language)即一种反标记(XML)语言。强调数据为中心,而非标记。YAML大小写敏感,使用缩进代表层级关系。
YAML中支持对象Object(对应Python中的字典), 数组Array(对应Python中的列表)以及常量(字符串、数字(int/float),true/false/null)。
相比于JSON格式,YAML免除了双引号,逗号,大括号,中括号等,(当然也支持原始的JSON格式),并且支持注释,类型转换,跨行,锚点,引用及插入等等。
基本格式
示例文件demo.yaml:
# 注释:示例yaml文件
name: Cactus
age: 18
skills:
-
- Python
- 3
-
- Java
- 5
has_blog: true
gf: ~
相当于以下JSON格式
{
"name": "Cactus",
"age": 18,
"skills": [
[
"Python",
3
],
[
"Java",
5
]
],
"has_blog": true,
"gf": null
}
类型转换
使用!!str, !!float等可以将默认类型转为指定类型,如
对应JSON格式
[
3.0,
"4",
"true"
]
多行文本及拼接
示例:
a: |
我
喜欢你b: >
我
不喜欢你
才怪对应JSON格式
{
"a": "我\n喜欢你\n",
"b": "我 不喜欢你 才怪"
}
锚点,引用及插入
在-或:后 加上&锚点名为当前字段建立锚点,下面可使用*锚点名引用锚点,或使用<<: *锚点名直接将锚点数据插入到当前的数据中,示例如下:
users:
- &zs
name: 张三
password: !!str 123456
- &ls
name: 李四
password: abcdefg
case1:
login: *zs
case2:
user:
<<: *ls
age: 20
对应JSON格式:
{
"users": [
{
"name": "张三",
"password": "123456"
},
{
"name": "李四",
"password": "abcdefg"
}
],
"case1": {
"login": {
"name": "张三",
"password": "123456"
}
},
"case2": {
"user": {
"name": "李四",
"password": "abcdefg",
"age": 20
}
}
}
Python操作YAML文件及字符串
需要安装pyyaml, pip install pyyaml
和JSON文件类似,yaml也提供load和dump两种方法。
由于yaml.load()支持原生Python对象,不安全,建议使用yaml.safe_load()
示例1:yaml字符串 -> 字典
import yaml
yaml_str = '''
name: Cactus
age: 18
skills:
-
- Python
- 3
-
- Java
- 5
has_blog: true
gf: ~
'''
print(yaml.safe_load(yaml_str))
打印结果:
{'name': 'Cactus', 'age': 18, 'skills': [['Python', 3], ['Java', 5]], 'has_blog': True, 'gf': None}
如果有中文,可以使用yaml.load(yaml_str.encoding('utf-8))
示例2:yaml文件 -> 字典
import yaml
with open('demo.yaml', encoding='utf-8') as f: # demo.yaml内容同上例yaml字符串
print(yaml.safe_load(f))
打印结果同上例。
字典 -> yaml字符串或文件
import yaml
dict_var = {'name': 'Cactus', 'age': 18, 'skills': [['Python', 3], ['Java', 5]], 'has_blog': True, 'gf': None}
print(yaml.dump(dict_var,)) # 转为字符串,使用默认flow流格式
with open('demo5.yaml', 'w', encoding='utf-8') as f:
yaml.dump(dict_var, f, default_flow_style=False) # 写入文件,不是用flow流格式
打印内容:
age: 18
gf: null
has_blog: true
name: Cactus
skills:
- [Python, 3]
- [Java, 5]
1demo5.yaml1文件内容:
age: 18
gf: null
has_blog: true
name: Cactus
skills:
- - Python
- 3
- - Java
- 5
更多操作可参考pyyaml官方文档:https://pyyaml.org/wiki/PyYAMLDocumentation
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持python博客。