yaml文件的读写操作

yaml文件的读写操作

不过尔尔 36 2023-12-03

YAML 简介

YAML,Yet Another Markup Language的简写,通常用来编写项目配置,也可用于数据存储,相比conf等配置文件要更简洁。

yaml是专门用来写配置文件的语言 yaml文件其实也是一种配置文件类型,后缀名是.yaml 或 .yml都可以

yaml的语法规则

  • 区分大小写

  • 使用缩进表示层级关系

  • 使用空格缩进,而非Tab键缩进

  • 缩进的空格数目不固定,只需要相同层级的元素左侧对齐

  • 文件中的字符串不需要引号标注,但若字符串中包含有特殊字符则需用引号标注

  • 多组数据之间使用3横杠—分割

  • 注释标识为 #(但不能在一段代码的行末尾加 # 注释,否则会报错)

yaml文件数据结构

  • 对象:键值对的集合(简称:"映射或字典") 键值对用冒号:结构来表示,冒号与值之间需用空格分隔

  • 数组: 一组按序排列的值(简称"序列或表") 数组前加有-符号,符号与值之间需用空格分隔

  • 纯量(scalars): 单个的、不可再分的值(如:字符串、bool值、整数、浮点数、时间、日期、null等) None值可用null~表示

yaml示例(test.yaml)

 # 字典 用冒号加空格连接键和值( : )
 name: 张三
 age: 20
 ---
 # 列表 短横线加一个空格(- )
 - 10
 - 20
 - 30
 # 当一个yaml文件内有多组数据时,用3个-分隔
 ---
 # 列表中的字典
 -
  name: 张三
  age: 21
 -
  A: apple
 ---
 # 字典中的字典
 name:
  name1: 张三
 ---
 # 字典中的列表
 name:
  - 张三
  - 李四
  - 王五
 age: 20
 ---
 # 元组(使用!!对数据类型进行转换,tuple由list转换而来)
 !!python/tuple
 - Android
 - 10
 - null
 - ~
 - True
 ---
 # 纯量(scalars)
 str: "Hello World!"
 int: 110
 float: 3.141
 # true or false
 boolean: true   
 # 也可以用 ~ 号来表示 null
 None: null      
 time: 2016-09-22t11:43:30.20+08:00 
 date: 2016-09-22

安装yaml库

 pip install pyyaml
 # 指定镜像源
 pip install pyyaml -i https://pypi.tuna.tsinghua.edu.cn/simple

读取与写入

load,safe_load(读取文档)

 import yaml
 ​
 with open('test.yaml','r', encoding='utf-8') as f:
 ​
     # data = yaml.load(f.read(), Loader=yaml.FullLoader)
     # print(data)
     data = yaml.safe_load(f.read(), Loader=yaml.FullLoader) # 官方推荐(安全)
     print(data)    

load_all,safe_load_all(读取多个文档)

 with open('test.yaml','r', encoding='utf-8') as f:
 ​
     # docs = yaml.load_all(f.read(), Loader=yaml.FullLoader)
     docs = yaml.safe_load_all(f.read(), Loader=yaml.FullLoader) # 官方推荐(安全)
 ​
     for doc in docs:
 ​
         for i, j in doc.items():
             print(i, ":", j)

:safe_load()(安全解析函数,解析yaml防止yaml文件中包含恶意代码)

dump,safe_dump(单数据写入文档)

 import yaml
 ​
 users = [{'name': '张三', 'age': 18},
          {'name': '李四', 'age': 20}]
 ​
 with open('test.yaml', 'w', encoding='utf-8') as f:
     # allow_unicode=True参数防止写入的中文乱码
     # yaml.dump(data=users, stream=f, ,allow_unicode=True)
     yaml.safe_dump(data=users, stream=f, ,allow_unicode=True) # 官方推荐(安全)

dump_all,safe_dump_all(多数据写入文档)

 Data1 = {
    "page": 1,
    "msg": "msg",
    "data": [1,2],
 }
 Data2 = {
    "page": 1,
    "msg": "msg",
    "data": [1,2],
 }
 with open('test.yml', 'w', encoding='utf-8') as f:
     # allow_unicode=True参数防止写入的中文乱码
     # yaml.dump_all(documents=[Data1, Data2], stream=f, allow_unicode=True)
     yaml.safe_dump_all(documents=[Data1, Data2], stream=f, allow_unicode=True)

dump(sort_keys排序键)

 import yaml
 ​
 with open('test.yaml',"w",encoding="utf-8") as f:
 ​
     data = yaml.load(f, Loader=yaml.FullLoader)
     print(data)
     # sort_keys=False,是yaml格式保持原来的排序(默认按照字母排序)
     sorted = yaml.dump(data, sort_keys=False)
     sorted = yaml.safe_dump(data, sort_keys=False)
     print(sorted)