python之json和yaml模块
json和yaml是常用的数据交换格式,yaml可以看做是json的超集。
1 json格式
json(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于在不同系统之间进行数据传输和存储。它由键值对构成的集合组成,通常以文件扩展名.json
命名。
JSON的结构非常简单,有两种基本的数据结构:
1. 对象(Object):
对象是一组无序的键值对集合,使用大括号{}
表示。每个键值对由一个键(字符串)和一个值(任意有效的JSON数据类型)组成,中间使用冒号:
分隔,键值对之间使用逗号,
分隔。
{
"name": "John",
"age": 30,
"city": "New York"
}
2. 数组(Array):数组是值(任意有效的JSON数据类型)的有序集合,使用方括号[]
表示。数组中的每个值可以是对象、数组、字符串、数字、布尔值或null
。
[
"apple",
"banana",
"orange"
]
JSON支持的数据类型包括:
- 字符串(String):由双引号
""
包围的Unicode字符序列。 - 数字(Number):整数或浮点数。
- 布尔值(Boolean):
true
或false
。 - 空值(Null):
null
表示空值。
注意:官方json版本不支持注释,因为json是一种数据交换格式,而不是一种编程语言。
JSON还支持嵌套结构,可以在对象中嵌套其他对象或数组,也可以在数组中嵌套其他数组或对象,形成复杂的数据结构。
{
"name": "John",
"age": 30,
"city": "New York",
"pets": [
{
"name": "Fluffy",
"species": "cat"
},
{
"name": "Buddy",
"species": "dog"
}
]
}
在线格式校验:
在线检测json格式网站:http://json.jsrun.cn/
2 python中使用json格式
python3中可以使用json模块对json数据进行编解码,主要包含如下4个函数:
json.load # 读取json文件,返回python 字典对象
json.dump # 将python 字典写入json文件,文件为json字符串格式,无返回
json.dumps() # python字典类型转为json字符串类型,返回json字符串[dict->str]
json.loads() # 将json字符串转为python 字典类型数[str->dict]
使用示例如下:
load和dump处理的主要是 文件
例如:读入test.json,通过json.load(f)得到python dict对象,修改python dict对象属性,然后写入新文件test_new.json中
import json
with open('test.json', 'r') as f:
data = json.load(f)
print(data)
print(type(data))
data["pets"][1]["name"] = "AAAA" # 修改python dict对象属性
with open('test_new.json', 'w') as f:
json.dump(data, f)
loads和dumps处理的主要是 字符串
例如:
import json
json_data = """
{
"name": "John",
"age": 30,
"city": "New York",
"pets": [
{
"name": "Fluffy",
"species": "cat"
},
{
"name": "Buddy",
"species": "dog"
}
]
}
"""
print(type(json_data))
data = json.loads(json_data)
print(data, type(data))
data["pets"][1]["name"] = "BBBB" # 修改python dict对象属性
data = json.dumps(data)
print(data, type(data))
执行结果如下:
<class 'str'>
{'name': 'John', 'age': 30, 'city': 'New York', 'pets': [{'name': 'Fluffy', 'species': 'cat'}, {'name': 'Buddy', 'species': 'dog'}]} <class 'dict'>
{"name": "John", "age": 30, "city": "New York", "pets": [{"name": "Fluffy", "species": "cat"}, {"name": "BBBB", "species": "dog"}]} <class 'str'>
3 YAML格式
YAML(YAML Ain't Markup Language)是一种人类可读的数据序列化格式。它的设计目标是使数据在不同编程语言之间传递变得简单、易于阅读和编写。YAML 是一种非常灵活的格式,几乎是 JSON 的超集,YAML采用了一种类似于其他标记语言(如XML或JSON)的结构,但与它们不同的是,YAML注重可读性和易用性。
特点如下:
- 可读性:YAML文件使用缩进(使用空格,2空格或者4空格,缩进表示父子关系)和结构化的方式来表示数据层次结构。
- 简洁性:YAML文件中使用的标记符号较少,更易于编辑和维护。
- 数据结构:YAML支持列表、字典和标量值等常见的数据结构。列表使用短横线(-)表示,多个列表项用换行分割,字典使用冒号(:)表示键值对。
- 注释:YAML支持注释,以井号(#)开头。注释可以用于对数据进行解释或提供额外的信息。
- 引用和锚点:YAML支持引用和锚点的概念,可以在数据中引用其他部分或共享相同的数据块。
- 数据类型:YAML支持多种数据类型,包括字符串、整数、浮点数、布尔值、日期等。它还可以表示复杂的数据类型,如正则表达式和时间间隔。
- 多语言支持:YAML是一种跨编程语言的格式,可以被大多数编程语言轻松解析和生成。
下面是一个简单的YAML示例,展示了一个包含姓名、年龄和爱好的人员列表:
- name: John
age: 25
hobbies:
- reading
- hiking
- name: Jane
age: 30
hobbies:
- painting
- cooking
这是一个包含两个人员信息的列表。每个人都有一个名字、年龄和爱好列表。使用YAML的结构和缩进表示了数据的层次关系和结构。
在线格式校验:
以下两个网址用来在线检查yaml文件格式:
网站1:http://nodeca.github.io/js-yaml/
网址2:http://yaml-online-parser.appspot.com/
4 python中使用yaml格式
python使用yaml模块对yaml数据进行编解码。提供如下两个常用函数:
# 使用python的load()方法读取yaml文件内容(反序列化), 在 yaml.load 方法中, loader 参数有四种:
# 1. BaseLoader:载入大部分的基础YAML
# 2. SafeLoader:载入YAML的子集,推荐在不可信的输入时使用
# 3. FullLoader:这是默认的载入方式,载入全部YAML
# 4. UnsafeLoader:老版本的载入方式
yaml.load(f, Loader=yaml.FullLoader)
# 使用python的dump()方法将python字典写入yaml文件(序列化)
# 当data数据中有汉字时,加上: encoding='utf-8',allow_unicode=True
yaml.dump(data, f, encoding='utf-8', allow_unicode=True)
使用示例如下:
例如:有一个yaml文件,我们修改其中一个字段,然后存到新的yaml中。
yaml文件如下:
# example.yml
nb1:
- admin1
- '123456'
nb2:
- admin2
- '111111'
nb3:
- admin3
- '222222'
python脚本如下:
import yaml
# 读yaml,将yaml转python字典
with open('example.yml', 'r') as f:
dic = yaml.load(f, Loader=yaml.FullLoader)
print(dic)
dic['nb3'][1] = 'AAAAA' # 修改nb3的密码
# 写yaml,将python字典写入yaml文件
with open('example_new.yml', 'w') as f:
yaml.dump(dic, f, encoding='utf-8', allow_unicode=True)
这样得到新生成的yaml文件:
# example_new.yml
nb2:
- admin2
- '111111'
nb3:
- admin3
- AAAAA
nb1:
- admin1
- '123456'
参考: