1、load() :返回一个对象
我们先创建一个yml
文件,config.yml
:
name:name: Tom Smith
age: 37
spouse:
name: Jane Smith
age: 25
children:
- name: Jimmy Smith
age: 15
- name1: Jenny Smith
age1: 12 Tom Smith
age: 37
spouse:
name: Jane Smith
age: 25
children:
- name: Jimmy Smith
age: 15
- name1: Jenny Smith
age1: 12
读取yml文件:
import yaml
f = open(r'/home/l/PycharmProjects/test_modules/config.yml')
y = yaml.load(f)
print (y)
运行结果:
{'name': 'Tom Smith', 'age': 37, 'spouse': {'name': 'Jane Smith', 'age': 25}, 'children': [{'name': 'Jimmy Smith', 'age': 15}, {'name1': 'Jenny Smith', 'age1': 12}]}
语法详细讲解
yaml.load(input, Loader=yaml.FullLoader)
目前的Loader选择是:
-
BaseLoader
仅加载最基本的YAML
-
SafeLoader
安全地加载YAML语言的子集。建议用于加载不受信任的输入。
-
FullLoader
加载完整的YAML语言。避免任意代码执行。这是当前(PyYAML 5.1)默认加载器调用
yaml.load(input)
(发出警告后)。 -
UnsafeLoader
(也称为Loader
向后兼容性)原始的Loader代码,可以通过不受信任的数据输入轻松利用。
您也可以使用其中一种快捷方式“糖”方法:
yaml.safe_load
yaml.full_load
yaml.unsafe_load
如果您是使用触发此警告的第三方模块的软件的作者/维护者,请首先确保它们的使用对您的应用程序是安全的。确保他们知道警告。然后,您可以“全局”禁用警告:
yaml.warnings({'YAMLLoadWarning': False})
脚注
此页面将及时更新,其中包含有关load()
弃用,使用和警告的最新信息。
2、load_all()生成一个迭代器
如果string
或文件包含几块yaml
文档,你可以使用yaml.load_all
来解析全部的文档。
import yaml
f = '''
---
name: James
age: 20
---
name: Lily
age: 19
'''
y = yaml.load_all(f)
for data in y:
print(data)
运行结果:
{'name': 'James', 'age': 20}
{'name': 'Lily', 'age': 19}
3、yaml.dump 将一个python对象生成为yaml文档
import yaml
aproject = {'name': 'Silenthand Olleander',
'race': 'Human',
'traits': ['ONE_HAND', 'ONE_EYE']
}
print(yaml.dump(aproject,))
运行结果:
name: Silenthand Olleander
race: Human
traits: [ONE_HAND, ONE_EYE]
yaml.dump
接收的第二个参数一定要是一个打开的文本文件或二进制文件,yaml.dump
会把生成的yaml
文档写到文件里
import yaml
aproject = {'name': 'Silenthand Olleander',
'race': 'Human',
'traits': ['ONE_HAND', 'ONE_EYE']
}
f = open(r'/home/l/PycharmProjects/test_modules/config.yml', 'w')
print(yaml.dump(aproject, f))
运行结果:
None
生成了config.yml
文件,文件内容
name: Silenthand Olleander
race: Human
traits: [ONE_HAND, ONE_EYE]
4、yaml.dump_all()将多个段输出到一个文件中
import yaml
obj1 = {"name": "James", "age": 20}
obj2 = ["Lily", 19]
with open(r'/home/l/PycharmProjects/test_modules/config.yml', 'w') as f:
yaml.dump_all([obj1, obj2], f)
运行结果:
{age: 20, name: James}
--- [Lily, 19]
二、yaml语法
1、基本规则
1. 大小写敏感
2. 使用缩进表示层级关系
3. 缩进时不允许使用Tab,只允许使用空格
4. 缩进的空格数目不重要,只要相同层级的元素左对齐即可
5. # 表示注释,从它开始到行尾都被忽略
2、yaml转字典
yaml中支持映射或字典的表示,如下:
# 下面格式读到Python里会是个dict
name: 灰蓝
age: 0
job: Tester
输出:
{'name': '灰蓝', 'age': 0, 'job': 'Tester'}
3、yaml转列表
yaml中支持列表或数组的表示,如下:
# 下面格式读到Python里会是个list
- 灰蓝
- 0
- Tester
输出:
['灰蓝', 0, 'Tester']
4、复合结构:
字典和列表可以复合起来使用,如下:
# 下面格式读到Python里是个list里包含dict
- name: 灰蓝
age: 0
job: Tester
- name: James
age: 30
输出:
[{'name': '灰蓝', 'age': 0, 'job': 'Tester'}, {'name': 'James', 'age': 30}]
5、基本类型:
字符串
整型
浮点型
布尔型
null
时间
日期
我们写个例子来看下:
# 这个例子输出一个字典,其中value包括所有基本类型
str: "Hello World!"
int: 110
float: 3.141
boolean: true # or false
None: null # 也可以用 ~ 号来表示 null
time: 2016-09-22t11:43:30.20+08:00 # ISO8601,写法百度
date: 2016-09-22 # 同样ISO8601
输出:
{'str': 'Hello World!', 'int': 110, 'float': 3.141, 'boolean': True, 'None': None, 'time': datetime.datetime(2016, 9, 22, 3, 43, 30, 200000), 'date': datetime.date(2016, 9, 22)}
如果字符串没有空格或特殊字符,不需要加引号,但如果其中有空格或特殊字符,则需要加引号了
str: 灰蓝
str1: "Hello World"
str2: "Hello\nWorld"
输出:
{'str': '灰蓝', 'str1': 'Hello World', 'str2': 'Hello\nWorld'}
里要注意单引号和双引号的区别,单引号中的特殊字符转到Python会被转义,也就是到最后是原样输出了,双引号不会被Python转义,到最后是输出了特殊字符;如
str1: 'Hello\nWorld'
str2: "Hello\nWorld"
输出:
{'str1': 'Hello\\nWorld', 'str2': 'Hello\nWorld'}
可以看到,单引号中的’\n’最后是输出了,双引号中的’\n’最后是转义成了回车
6、强制转换
yaml是可以进行强制转换的,用 !! 实现,如下:
str: !!str 3.14
int: !!int "123"
输出:
{'int': 123, 'str': '3.14'}
1明显能够看出123被强转成了int类型,而float型的3.14则被强转成了str型。
7、分段
在同一个yaml文件中,可以用 — 来分段,这样可以将多个文档写在一个文件中
---
name: James
age: 20
---
name: Lily
age: 19
8、 引用
& 和 * 用于引用
name: &name 灰蓝
tester: *name
这个相当于一下脚本:
name: 灰蓝
tester: 灰蓝
输出:
{'name': '灰蓝', 'tester': '灰蓝'}
网友评论