yaml基础

1.yaml安装
pip install pyyaml	
2.基本语言规则
  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进时不允许使用Tab键,只允许使用空格。
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
3.yaml文件书写格式

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


4.读取yaml文件

使用如下代码读取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
1 Like
关闭