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):truefalse
  • 空值(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注重可读性和易用性。

特点如下:

  1. 可读性:YAML文件使用缩进(使用空格,2空格或者4空格,缩进表示父子关系)和结构化的方式来表示数据层次结构。
  2. 简洁性:YAML文件中使用的标记符号较少,更易于编辑和维护。
  3. 数据结构:YAML支持列表、字典和标量值等常见的数据结构。列表使用短横线(-)表示,多个列表项用换行分割,字典使用冒号(:)表示键值对。
  4. 注释:YAML支持注释,以井号(#)开头。注释可以用于对数据进行解释或提供额外的信息。
  5. 引用和锚点:YAML支持引用和锚点的概念,可以在数据中引用其他部分或共享相同的数据块。
  6. 数据类型:YAML支持多种数据类型,包括字符串、整数、浮点数、布尔值、日期等。它还可以表示复杂的数据类型,如正则表达式和时间间隔。
  7. 多语言支持: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'

参考:

  1. 【python】json.dumps() 与 json.loads() 用法
  2. yaml 文件格式语法
  3. YAML格式
  4. yaml文件读取load()、写入dump()
posted @ 2023-06-17 12:35  sureZ_ok  阅读(556)  评论(0编辑  收藏  举报