1-Python - pyyaml

about

引自pypi官网:

YAML([ˈjæməl] Yet Another Markup Language)是一种数据序列化格式,设计用于人类的可读性和与脚本语言的交互。PyYAML是Python的YAML解析器和生成器。

PyYAML提供了一个完整的YAML 1.1解析器、Unicode支持、pickle支持、支持扩展API和合理的错误消息。PyYAML支持标准的YAML标记,并提供了特定于Python的标记,允许表示任意的Python对象。

PyYAML适用于范围广泛的任务,从复杂的配置文件到对象序列化和持久性。

YAML是一种被认为可以超越XML、JSON的配置文件,最早接触是Spring Boot.........

yaml基本语法规则

  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进时不允许使用Tab键,只允许使用空格。
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
  • #表示注释,从这个字符一直到行尾,都会被解析器忽略,这个和python的注释一样

yaml支持的数据结构有3种

  • 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
  • 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
  • 纯量(scalars):单个的、不可再分的值。字符串、布尔值、整数、浮点数、Null、时间、日期

安装

pip install pyyaml
pip install -i https://pypi.doubanio.com/simple pyyaml

或者从pypi官网下载包,然后使用setup.py安装:

python setup.py install

https://pypi.org/project/PyYAML/

yaml文件长这样:

client:
  default-character-set: utf8
custom:
  user1:
    pwd: 666
    user: zhangkai
  user2:
    pwd: 999
    user: zhangkai
mysql:
  password: 123
  user: new_root

usage

写文件

还是老套路,创建一个yaml文件:

import yaml

d = {
    "client": {"default-character-set": "utf8"},
    "mysql": {"user": 'root', "password": 123},
    "custom": {
        "user1": {"user": "zhangkai", "pwd": 666},
        "user2": {"user": "zhangkai", "pwd": 999},
    }
}
# 直接dump可以把对象转为YAML文档
print(yaml.dump(d))
with open('./my.yaml', 'w', encoding='utf-8') as fw:
    yaml.dump(d, fw)

读文件

import yaml

file_path = './my.yaml'

with open(file_path, 'r', encoding='utf-8') as fr:
    data = yaml.load(fr)
print(data)

这么着虽然能打印出结果,但是会有一个YAMLLoadWarning提示:

YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details.

反正说这么用不安全......

解决办法是在load的时候加一个参数:

import yaml

file_path = './my.yaml'
with open(file_path, 'r', encoding='utf-8') as fr:
    data = yaml.load(fr, yaml.FullLoader)
print(data)

更新操作

import yaml

file_path = './my.yaml'
with open(file_path, 'r', encoding='utf-8') as fr:
    data = yaml.load(fr, yaml.FullLoader)

data['mysql']['user'] = 'new_root'

with open(file_path, 'w', encoding='utf-8') as fw:
    yaml.dump(data, fw)

我觉得上述代码没啥好解释的,从yaml文件中读取出整个字典,然后一顿操作猛如虎后,还不是要乖乖的重新写入到文件......这当然达到了更新的操作。

至于其他的操作,由于读取的yaml文件是个字典类型的数据,我就不多说了。


欢迎斧正,that's all see also:

YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe | python操作YAML文件之pyyaml库 | Python的PyYAML模块详解

posted @ 2019-10-10 19:20  听雨危楼  阅读(2300)  评论(0编辑  收藏  举报