Python yaml文件读写
时间:2021-07-13
本文章向大家介绍Python yaml文件读写,主要包括Python yaml文件读写使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
yaml相比json来说数据表示更加简洁,特别适合用来读取/更新配置文件,和json一样,也是一种数据串行化格式。json的序列化和反序列化可参考Python json文件读写,下面来介绍在Python中PyYAML库解析、保存yaml文件的方法。
YAML介绍
YAML是YAML Ain't a Markup Language(YAML不是一种标记语言)的缩写,它其实也是一种标记语言(Yet Another Markup Language),但为了强调这种语言以数据作为中心,而不是以标记语言为重点,而用反向缩略语重命名。(维基百科:https://zh.wikipedia.org/wiki/YAML)
YAML和JSON差异
- YAML使用缩进表示层级关系,使用空格进行缩进,JSON使用大括号和方括号
- YAML允许使用
#
注释,JSON不能 - YAML的字符串可以使用单引号或者双引号,JSON必须使用双引号
YAML文档:
Arrays:
- 1
- 2
- 3
Dicts:
'1': 1
'2': 2
Numbers: 1
Strings: value
JSON文档:
{
"Arrays": [
1,
2,
3
],
"Numbers": 1,
"Strings": "value"
}
yaml序列化
Python 安装 PyYAML库
pip install pyyaml
dump
dump函数将Python对象序列化为一个YAML文档或者字符串。
import yaml
data1 = {'Numbers':1, 'Strings':"value", 'Arrays':[1,2,3], 'Dicts':{'1':1,'2':2}}
data = yaml.dump(data1, explicit_start=True)
print(data)
print(type(data))
执行结果:
---
Arrays:
- 1
- 2
- 3
Dicts:
'1': 1
'2': 2
Numbers: 1
Strings: value
<class 'str'>
dump_all
序列化多组对象,yaml文件中的多组数据用---
分隔。
data2 = [1,2,3]
print(yaml.dump_all([data1,data2], explicit_start=True))
执行结果:
---
Arrays:
- 1
- 2
- 3
Dicts:
'1': 1
'2': 2
Numbers: 1
Strings: value
---
- 1
- 2
- 3
保存到文件中
可以将序列化数据保存到文件中。
with open("data1.yaml", "w", encoding="utf-8") as f:
yaml.dump(data1,f,allow_unicode=True)
序列化类实例
和json一样,也可以序列化类实例。
class Person(yaml.YAMLObject):
yaml_tag = u'!Person'
def __init__(self, name, height):
self.name = name
self.height = height
def __repr__(self):
return f"{self.name}‘s height is {self.height}cm"
p = Person(name='zhangsan', height=175)
print(p)
print(yaml.dump(p))
with open("data2.yaml", "w", encoding="utf-8") as f:
yaml.dump(p,f,allow_unicode=True)
执行结果:
zhangsan‘s height is 175cm
!Person
height: 175
name: zhangsan
yaml反序列化
主要有load、safe_load、load_all和safe_load_all4种方法,safe_load()
方法只识别标准的YAML标签,防止不信任的对象输入。
load
支持任意类型的python对象,
datas = '{"Numbers":1, "Strings":"value", "Arrays":[1,2,3]}'
# data = yaml.safe_load(datas)
data = yaml.load(datas)
print(data)
print(type(data))
执行结果:
{'Numbers': 1, 'Strings': 'value', 'Arrays': [1, 2, 3]}
<class 'dict'>
load_all
加载多组序列化yaml数据
with open("data1.yaml", encoding="utf-8") as f:
datas = yaml.load_all(f)
print(datas)
for data in datas:
print(data)
print(type(data))
执行结果:
<generator object load_all at 0x000001D8AE697CC8>
{'Arrays': [1, 2, 3], 'Dicts': {'1': 1, '2': 2}, 'Numbers': 1, 'Strings': 'value'}
<class 'dict'>
修改字段内容
import yaml
with open("data1.yaml", encoding="utf-8") as f:
# data = yaml.safe_load(f)
data = yaml.load(f)
data['Arrays'].append(4)
data['Strings'] = 'hello'
# data.update({data['Strings']:hello})
print(data)
with open("data1.yaml", "w", encoding="utf-8") as f:
yaml.dump(data,f,allow_unicode=True)
执行结果:
{'Arrays': [1, 2, 3, 4], 'Dicts': {'1': 1, '2': 2}, 'Numbers': 1, 'Strings': 'hello'}
加载Python类实例
和json一样,也支持加载Python类的实例
import yaml
class Person(yaml.YAMLObject):
yaml_tag = u'!Person'
def __init__(self, name, height):
self.name = name
self.height = height
def __repr__(self):
return f"{self.name}‘s height is {self.height}cm"
with open("data2.yaml", encoding="utf-8") as f:
p = yaml.load(f)
print(p.name)
执行结果:
zhangsan
参考文档:
pyyaml官方文档:https://pyyaml.org/wiki/PyYAMLDocumentation
欢迎关注公众号:「测试开发小记」及时接收最新技术文章!
原文地址:https://www.cnblogs.com/hiyong/p/14907368.html
- Hive Load本地数据文件异常分析
- 使用Java代码通过JDBC连接只启用Sentry的Impala异常分析
- 如何在CDSW中定制Docker镜像
- 干货:排名前 16 的 Java 工具类!
- 危险:会话固定攻击漏洞,你们的系统都堵上了吗?
- 深度学习入门者必看:25个你一定要知道的概念
- 如何在CM中启用YARN的使用率报告
- 如何修改CDSW服务的DNS和HOSTNAME
- 想尝试搭建图像识别系统?这里有一份TensorFlow速成教程
- 如何查看集成Sentry后Hive作业的真实用户
- 如何在Impala中实现拉链表
- 多图见证模拟机器人的逆天成长:论进化策略在强化学习中的应用
- Hue禁止用户下载数据问题分析
- 如何在RedHat6上使用Bind搭建DNS服务
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- php中echo与print区别点整理
- laravel框架模型和数据库基础操作实例详解
- Yii Framework框架使用PHPExcel组件的方法示例
- thinkphp3.2.3框架动态切换多数据库的方法分析
- 安装docker和docker-compose实例详解
- 如何判断php复选框是否被选中
- php实现的生成排列算法示例
- php多进程应用场景实例详解
- Linux Crontab Shell脚本实现秒级定时任务的办法
- laravel框架实现为 Blade 模板引擎添加新文件扩展名操作示例
- yii框架使用分页的方法分析
- Linux服务器间文件实时同步的实现
- TP3.2.3框架文件上传操作实例详解
- yii2.0框架场景的简单使用示例
- Laravel5.6框架使用CKEditor5相关配置详解