pip install pyyaml
PyYAML允许构造任何类型的Python对象,以下的格式都可以嵌套使用
#文件中添加类
!!python/object:类名
#使用 - 创建列表 返回列表 ['a','b','c'],使用多个 - 会多重嵌套
- a
- b
- c
#返回 [[['a','b','c']]]
-
-
- a
- b
- c
#返回字典{'int': 'a', 'float': 'b', 'string': 'c'}
int: {name:s,foo:b}
float: b
string: c
#返回空
int:~
#强制转换数据类型,输出
str: !!str 123
str2: !!str true
#使用 | 保留换行 使用 > 折叠换行
#使用 + 保留文字末尾换行 - 删除字符串末尾换行
#锚点 &(建立多锚点) 和别名 *(引用锚点) 的使用
defaults: &defaults #创建
adapter: postgres
host: localhost
development:
database: myapp_development
<<: *defaults # 引用 <<表示合并到当前数据,意思是将defaults那一项全部合并到这里
test:
database: myapp_test
<<: *defaults # 引用
# 输出为
defaults:
adapter: postgres
host: localhost
development:
database: myapp_development
adapter: postgres
host: localhost
test:
database: myapp_test
adapter: postgres
host: localhost
#列表中使用锚点 输出为 [ 'Steve', 'Clark', 'Brian', 'Oren', 'Steve' ]
- &showell Steve
- Clark
- Brian
- Oren
- *showell
使用如下代码读取yaml文件
def read_yaml(path):
with open(path, 'r', encoding='utf8') as f:
return yaml.safe_load(f.read())
使用yaml.safe_load(),这个只解析基本的yaml标记,用来保证代码的安全性,不过这对于平常保存数据是足够了,源码如下
def safe_load(stream):
"""
Parse the first YAML document in a stream
and produce the corresponding Python object.
Resolve only basic YAML tags. This is known
to be safe for untrusted input.
"""
return load(stream, SafeLoader)
def load(stream, Loader=None):
"""
Parse the first YAML document in a stream
and produce the corresponding Python object.
"""
if Loader is None:
load_warning('load')
Loader = FullLoader
loader = Loader(stream)
try:
return loader.get_single_data()
finally:
loader.dispose()
可以看到safe_load就是在load方法中传入SafeLoader的解析器,那么yaml有些什么Loader呢?
下面是官方的解释
UnsfeLoader & Loader
The original Loader code that could be easily exploitable by untrusted data input.
SafeLoader:
Loads a subset of the YAML language, safely. This is recommended for loading untrusted input.
安全的加载yaml语言子集,对于加载不受信任的输入,推荐使用此种方式 yaml.safe_load()
FullLoader:
Loads the full YAML language. Avoids arbitrary code execution. This is currently (PyYAML 5.1) the default loader called by yaml.load(input)
(after issuing the warning).
加载完整的yaml语言,从上方的源码可以看出这个是loade()默认的加载方式
BaseLoader:
Only loads the most basic YAML
只加载最基本的yaml
那么为什么要使用safe_load而不使用load呢,下方的帖子做了一些说明,内容是load()可以轻易的调用任何python函数,那么就有可以从yaml读取到一些恶意代码,从而使得程序变得不安全,为了保证程序 的安全性,所以需要使用safe_load来安全的加载子集
https://blog.csdn.net/enemy_sprites/article/details/102571523