[Python] 读写yaml文件和处理yaml分段

安装处理yaml的模块

pip install pyyaml
  • yaml.load(stream) / yaml.safe_load(stream):将输入stream对象加载为字典类型。

    推荐使用yaml.safe_load(),将加载对象限制为简单的Python对象,如整数或列表 。

    yaml.load() 能通过加载yaml文件构建任何类型的python对象,若加载的yaml文件来源不可信,则可能产生注入攻击的风险。

  • yaml.dump(data) / yaml.safe_dump(data):将data转为YAML类型。同样,推荐使用 yaml.safe_dump(data)

一、yaml 转 Python数据类型

假如有一个yaml文件,结构如下:

name: 小明
number: 20200235
class: 2020-B

score:
  - English: 88
    Math: 90
family:
  - father:
      - name: 小刚
      - phone: 188
  - mother:
      - name: 小红
      - phone:

使用方式:

import yaml

def parse_key(yaml_path):
    with open(yaml_path, mode='r', encoding='utf-8') as f:
        return yaml.safe_load(f)

if __name__ == '__main__':
    print(parse_key('xiaoming_info.yaml'))

yaml 转 字典

father:
  - name: 小刚
  - phone: 188
mother:
  - name: 小红
  - phone:
{'father': [{'name': '小刚'}, {'phone': 188}], 'mother': [{'name': '小红'}, {'phone': None}]}

yaml 转 列表

- name: 小刚
- phone: 188
[{'name': '小刚'}, {'phone': 188}]

yaml 转 结构等

- father:
    - name: 小刚
    - phone: 188
- mother:
    - name: 小红
    - phone:
[{'father': [{'name': '小刚'}, {'phone': 188}]}, {'mother': [{'name': '小红'}, {'phone': None}]}]

处理yaml中的中文

1. 文件输入

打开文件时指定encoding='utf-8'

def parse_key(yaml_path):
    with open(yaml_path, mode='r', encoding='utf-8') as f:
        return yaml.safe_load(f)
2. 字符串输入

无需指定,

info = \
"""
name: 小明
number: 20200235
class: 2020-B
"""

print(yaml.safe_load(info))
# print(yaml.safe_load(info.encode('utf-8')))

二、Python 数据类型转yaml

info = {'name': '小明', 'number': 20200235, 'class': '2020-B'}
print(yaml.dump(info))
print(yaml.dump(info, allow_unicode=True))
print(yaml.safe_dump(info, allow_unicode=True))
print(yaml.safe_dump(info, allow_unicode=True, encoding='utf-8',allow_unicode=True))

# a是追加写入,w是覆盖写入
with open('student_info.yaml', 'a', encoding='utf-8') as f:
    # stream可以是文件流
    yaml.dump(info, stream=f, allow_unicode=True, encoding='utf-8')
class: 2020-B
name: "\u5C0F\u660E"
number: 20200235

class: 2020-B
name: 小明
number: 20200235

class: 2020-B
name: 小明
number: 20200235

三、yaml分段---

在一个yaml文件中,可以使用—来分段(3个横线),这样可以将多个文档写入一个文件中:

father:
  - name: 小刚
  - phone: 188
---
mother:
  - name: 小红
  - phone:

safe_load_all()方法,load_all方法会生产一个迭代器,可以用for循环输出:

import yaml

def parse_key(yaml_path):
    with open(yaml_path, mode='r', encoding='utf-8') as f:
        for g in yaml.safe_load_all(f):
            print(g)

if __name__ == '__main__':
    parse_key('xx.yaml')
{'father': [{'name': '小刚'}, {'phone': 188}]}
{'mother': [{'name': '小红'}, {'phone': None}]}

同样也可以将多个字典类型转为yaml:

info1 = {'father': [{'name': '小刚'}, {'phone': 188}]}
info2 = {'mother': [{'name': '小红'}, {'phone': None}]}

print(yaml.safe_dump_all([info1, info2], allow_unicode=True))

with open('student_info.yaml', 'w', encoding='utf-8') as f:
    yaml.safe_dump_all([info1, info2], stream=f, allow_unicode=True)
father:
- name: 小刚
- phone: 188
---
mother:
- name: 小红
- phone: null

参考博客: Python3操作YAML文件

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值