首页 > 编程语言 >python之json和ymal模块

python之json和ymal模块

时间:2023-06-17 12:44:06浏览次数:68  
标签:name YAML python ymal json yaml data

json和ymal是常用的数据交换格式,ymal可以看做是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格式网站:https://www.bejson.com/

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()

标签:name,YAML,python,ymal,json,yaml,data
From: https://www.cnblogs.com/sureZ-learning/p/17487357.html

相关文章

  • Python自学整理
    Python对大小写敏感。在Windows下可以不写第一行注释:#!/usr/bin/python3第一行注释标的是指向python的路径,告诉操作系统执行这个脚本的时候,调用/usr/bin下的python解释器。此外还有以下形式(推荐写法):#!/usr/bin/envpython3这种用法先在env(环境变量)设置里查找pyth......
  • Python 文件操作(转载)
    Python文件操作操作文件时,一般需要经历如下步骤打开文件操作文件一、打开文件文件句柄=open('文件路径','模式')打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作。打开文件的模式有r,只读模式(默认)。w,只......
  • Python os 模块简述
    os模块简介os就是“operatingsystem”的缩写,顾名思义,os模块提供的就是各种Python程序与操作系统进行交互的接口。通过使用os模块,一方面可以方便地与操作系统进行交互,另一方面页也可以极大增强代码的可移植性。如果该模块中相关功能出错,会抛出OSError异常或其子类异常。impo......
  • Python程序与设计
    2-27在命令行窗口中启动的Python解释器中实现在Python自带的IDLE中实现print("Helloworld")编码规范每个import语句只导入一个模块,尽量避免一次导入多个模块不要在行尾添加分号“:”,也不要用分号将两条命令放在同一行建议每行不超过80个字符使用必要的空行可以增加代码的可读性运算......
  • Python自动化运维
    2-27在命令行窗口中启动的Python解释器中实现在Python自带的IDLE中实现print("Helloworld")编码规范每个import语句只导入一个模块,尽量避免一次导入多个模块不要在行尾添加分号“:”,也不要用分号将两条命令放在同一行建议每行不超过80个字符使用必要的空行可以增加代码的可读性运算......
  • Python数据类型-字典与集合
    """题目1:下面关于字典的定义正确的是:CA.d={1,}B.d={1,2:3,4}C.d={'name':'xinlan','age':18}D.d={[1,2]:[3,4],'age':18}"""#题目2:请创建一个字典用来表示你自己的个人信息。有哪些key由你自己来决定。my_info={'name':&......
  • Day01 1.4 Python虚拟环境的搭建
    Day011.4Python虚拟环境的搭建【一】虚拟环境介绍(1)虚拟环境优点1、使不同应用开发环境相互独立2、环境升级不影响其他应用,也不会影响全局的python环境3、防止出现包管理混乱及包版本冲突(2)什么是虚拟环境,为什么要有它?它解决了什么问题操作系统装了python3.8使用djang......
  • python入门学习之《python编程快速上手》
    #《python编程快速上手》1-9章第1-2章:python基础和控制流#python严格区分大小写;#代码行的缩进很重要,一般用4个空格。大多数情况下,代码行缩进告诉python它属于哪个代码块。#python下标从0开始;#行末使用续行字符\,将一行指令写成多行。在[],{},或()中的多行语句,不需要使用反斜......
  • python之冒泡排序
    冒泡排序原理:;两两比较,将(大、小)的元素往右移importrandoma=random.sample(range(0,10),4)#随机生成4个1到10之内的数字lenth=len(a)#获取长度print(a)#需要冒泡排序的列表#比较(趟数),最后一趟无需比较,所以减1forjinrange(lenth-1):#-1:最后一......
  • Python设计模式-07-装饰模式
    装饰模式是一种结构型设计模式,它允许我们动态地将行为添加到对象中,而不需要使用继承。装饰模式通常包括以下几个角色:抽象组件(Component):定义了一个接口,用于被装饰对象和装饰器共同实现。具体组件(ConcreteComponent):实现了抽象组件定义的接口,并提供了默认的行为。抽象装饰......