当前位置: 首页 > 工具软件 > PyYAML > 使用案例 >

Python 基础 - 第三方模块PyYAML

农建弼
2023-12-01

目录

1. yaml基本示例 

2. yaml组织结构

3. pyyaml的安装

4. 读取 / 写入单个yaml文件

5. 读取 / 写入多yaml文件


yaml官方文档:YAML Ain’t Markup Language (YAML™) revision 1.2.2

pyyaml官方文档:https://pyyaml.org/wiki/PyYAMLDocumentation

1. yaml基本示例 

  • 列表 (Sequence of Scalars),用 - 值 来表示数组中的每个元素,其中字符串不用单独加引号来表示
- Apple
- Banana
- orange
  • Map集合-值是标量 (Mapping Scalars to Scalars):用冒号和空格来表示键值对
hr:  65  
avg: 0.278 
rbi: 147    
  • Map集合-值是列表 (Mapping Scalars to Sequences),#表示注释
american: 
- Boston Red Sox # 键值对中的值是列表
- Detroit Tigers
- New York Yankees
national:
- New York Mets
- Chicago Cubs
- Atlanta Braves
  • Map集合的列表 (Sequence of Mappings)
-
  name: Mark
  hr:   65
  avg:  0.278
-
  name: Sammy
  hr:   63
  avg:  0.288
  • 列表的列表 (Sequence of Sequences)
- [name , hr, avg  ]
- [Mark , 65, 0.278]
- [Sammy, 63, 0.288]
  • 集合的集合 (Mapping of Mappings)
Mark: {hr: 65, avg: 0.278}
Sammy: {
    hr: 63,
    avg: 0.288,
 }

其余很多我就不赘述了,包括与python不同的是对于mapping的key值有列表等形式,还是比较推荐大家去官方文档查看里面示例非常清楚了

2. yaml组织结构

一个yaml文件可以由一个或多个文档组成,文档之间使用“---作为分隔符。如果 yaml文件只包含一个文档,则"---"分隔符可以省略。"..."是一个文档的结束(非必须)。

 # 结束符的三个点可以省略
---
age: 20
player: Sammy
...
---
age: 21
player: Sammy
... 

3. pyyaml的安装

1. 因为pyyaml是第三方模块,所以推荐直接使用pip安装即可

pip install pyyaml

2. 如果pip没有安装成功,还可以通过源码安装

下载源包PyYAML-5.1.tar.gz并解压缩,进入PyYAML-5.1目录,运行如下命令:

python setup.py install

4. 读取 / 写入单个yaml文件

yaml.load(stream, Loader=None) 函数用于将一个yaml文档转换为一个python对象。yaml.load接受一个字符串、二进制文件或文本文件对象等。

如下为test.yaml文件内容

name:
  - wmq
  - hello
  - world  

使用yaml.load(stream, Loader=None) 读取文件内容。yaml 5.1版本后弃用了yaml.load(file)这个用法,因为该用法不安全,5.1版本之后通过FullLoader,使该load函数也变得更加安全

import yaml

if __name__ == "__main__":
    with open('./test.yaml', 'r', encoding='utf-8') as f:
	    data = yaml.load(stream=f, Loader=yaml.FullLoader)
	    print(data)  # {'name': ['wmq', 'hello', 'world']}

 写入文件内容使用yaml.dump(data, f),与python的json模块相似:

import yaml

if __name__ == "__main__":
    data = {'name': 'wmq','scores': [100, 90]}
    with open('./test.yaml', 'w', encoding='utf-8') as f:
	    yaml.dump(data, f)

5. 读取 / 写入多yaml文件

读文件使用yaml.load_all(),其中返回的是generator,可勇for循环或者next取值

import yaml

if __name__ == "__main__":
    with open('./test.yaml', 'r', encoding='utf-8') as f:
        all_data = yaml.load_all(stream=f, Loader=yaml.FullLoader)
        for data in all_data:
            print(data)

同理,将多个文件内容写入yaml文件使用 yaml.dump_all()

import yaml

if __name__ == "__main__":
    obj1 = {"name": "wmq", "age": 10}
    obj2 = {"name": "pkq", "age": 11}
    with open('./test.yaml', 'w', encoding='utf-8') as f:
        yaml.dump_all([obj1, obj2], f)

test.yaml文件结果如下:

#------------------test.yaml-------------
age: 10
name: wmq
---
age: 11
name: pkq
 类似资料: