首页 > 编程语言 >Python的json序列化模块

Python的json序列化模块

时间:2023-12-07 23:11:06浏览次数:43  
标签:Python JSON dic json 字符串 序列化 data

一、json

Json模块提供了四个功能:dumps、dump、loads、load

1、前景

什么叫序列化——将原本的字典、列表等内容转换成一个字符串的过程就叫做序列化。

序列化的目的

  • 以某种存储形式使自定义对象持久化
  • 将对象从一个地方传递到另一个地方。
  • 使程序更具维护性

在Python中,能够进行序列化的前提是被序列化的对象必须是JSON兼容的数据类型。JSON兼容的数据类型包括:

  1. 字典(Dictionary):键值对的集合,键必须是字符串类型。
  2. 列表(List):有序的元素集合。
  3. 字符串(String):由一系列字符组成的文本。
  4. 数字(Number):包括整数(int)和浮点数(float)。
  5. 布尔值(Boolean):表示真或假的值,即True或False。
  6. None:表示空值或缺失值的特殊类型。

2、loads和dumps(反序列化和序列化)

也可以处理嵌套的数据类型

序列化,将字典序列化成一个字符串

json.dumps(dic)

dic = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
str_dic = json.dumps(dic)  # 序列化:将一个字典转换成一个字符串
print(type(str_dic), str_dic)  # <class 'str'> {"k3": "v3", "k1": "v1", "k2": "v2"}
# 注意,json转换完的字符串类型的字典中的字符串是由""表示的

 

反序列化,将字符串转成字典

json.loads(str_dic)

dic = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
str_dic = json.dumps(dic)
dic2 = json.loads(str_dic)  # 反序列化:将一个字符串格式的字典转换成一个字典
# 注意,要用json的loads功能处理的字符串类型的字典中的字符串必须由""表示
print(type(dic2), dic2)  # <class 'dict'> {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}

 

序列化字符串

import json
string_data = 'Hello, World!'
# 序列化字符串
json_str = json.dumps(string_data)
print(json_str)
# 反序列化
res = json.loads(json_str)
print(res)

 

3、load和dump(反序列化读和序列化写)

json.dump(data, f),data要是可迭代的容器,字典或者列表

注意⚠️:

使用 json.dump() 方法来序列化一个字符串写入文件时,需要将字符串包装在一个可迭代的容器中,例如列表或字典

例如字符串:

import json
 
string_data = "Hello, World!"
 
# 创建包含字符串的字典
data = {'message': string_data}
 
# 序列化字符串并写入文件
with  open('output.json', 'w') as f:
    json.dump(data, f)

 

列表:列表是可迭代对象可以直接序列化写

import json
 
list_data = [1, 2, 3, 4, 5]
 
# 序列化列表并写入文件
with  open('output.json', 'w') as f:
    json.dump(list_data, f)

 

序列化写字典

with  open('a.txt', 'w') as f:
    dic = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
    json.dump(dic, f)  # dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件
 
with  open('a.txt', 'r') as f:
    dic2 = json.load(f)  # load方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回
    print(type(dic2), dic2) # <class 'dict'> {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}

 

案例:

登录注册时候,数据的写入和读取

json.load(f) 函数用于从文件中加载 JSON 数据,但是它只能读取一个合法的 JSON 对象,当文本 f 中,存在多个 JSON 对象,导致出现错误。

要解决这个问题,将文本中的每个 JSON 对象分别解析处理。可以使用 json.loads() 函数逐行解析每个 JSON 对象,然后进行处理。

换行处理

json.dump(data, f, ensure_ascii=True)
f.write('\n')

 

代码如下:

import json
 
username, password, role = input('Username:').split()
data = {
    'username': username,
    'password': password,
    'role': role
}
 
with  open('user_data.txt', "r", encoding='utf-8') as f:
    lines = f.readlines()
    for line in lines:
        line = line.strip()  # 去除行首行尾的空白字符
        obj = json.loads(line)
        if username == obj['username']:
            print('用户已经注册过了!')
            break
    else:
        with  open('user_data.txt', "a", encoding='utf-8') as f:
            json.dump(data, f, ensure_ascii=True)
            f.write('\n')
            # f.write(f"{username},{password},{role}\n")
            print(f"用户 {data['username']} 已成功注册!")
 
with  open('user_data.txt', "r", encoding="utf-8") as f:
    lines = f.readlines()
    for line in lines:
        line = line.strip()  # 去除行首行尾的空白字符
        if line:  # 确保行不为空
            try:
                obj = json.loads(line)
                # 在这里对每个 JSON 对象进行处理
                print(obj, type(obj))
            except json.JSONDecodeError:
                print('无效的 JSON 数据:', line)

4、ensure_ascii关键字参数

汉字的序列化后为\u56fd\u7c4d,使用ensure_ascii关键字参数可以以中文写入

5、格式化输出(indent)

json.dumps() 是 json 模块中的一个函数,用于将 Python 对象序列化为 JSON 字符串。它提供了一些参数来控制序列化的行为。下面是对 json.dumps() 中的常用序列化参数的解释:

  • sort_keys(可选参数):设置为 True 时,将按照键的字母顺序对字典进行排序,默认为 False

  • indent(可选参数):指定缩进级别,用于生成格式化的 JSON 字符串。可以是一个整数,表示缩进的空格数,或者是一个字符串,表示使用的缩进字符(例如,\t 表示使用制表符进行缩进)。默认为 None,表示不进行格式化,生成紧凑的 JSON 字符串。

  • separators(可选参数):指定分隔符,用于控制生成的 JSON 字符串中的各个部分之间的分隔符。它是一个包含两个字符串的元组,第一个字符串用于分隔键和值之间的分隔符,默认为 ",";第二个字符串用于分隔键值对之间的分隔符,默认为 ":"

  • ensure_ascii(可选参数):设置为 True 时,所有非 ASCII 字符将被转义为 ASCII 编码的字符序列,默认为 True。如果需要生成包含非 ASCII 字符的 JSON 字符串,可以将其设置为 False

    import json
     
    data = {'username': ['李四', '银行职员'], 'sex': 'male', 'age': 16}
    json_dic2 = json.dumps(data, sort_keys=True, indent=2, separators=(',', ':'), ensure_ascii=False)
    print(json_dic2)

     

# 输出结果

  • sort_keys=True:按照键的字母顺序对字典进行排序。
  • indent=2:使用两个空格进行缩进,生成格式化的 JSON 字符串。
  • separators=(',', ':'):使用逗号和冒号作为分隔符。
  • ensure_ascii=False:允许非 ASCII 字符在生成的 JSON 字符串中原样显示。

二、pickle 模块

1、用于序列化的两个模块

  • json,用于字符串 和 python数据类型间进行转换 (可以跨语言使用)
  • pickle,用于python特有的类型 和 python的数据类型间进行转换
  • pickle 能够转换所有的pyhton数据类型、序列化后为二进制
  • json只能转换部分的python数据类型

 

2、pickle模块提供了四个功能:dumps(序列化)、dump(序列化写)、loads(反序列化)、load(反序列化读)

(不仅可以序列化字典,列表...可以把python中任意的数据类型序列化)

序列化和反序列化

import pickle
 
dic = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
str_dic = pickle.dumps(dic)
print(str_dic)  # 一串二进制内容
# b'\x80\x03}q\x00(X\x02\x00\x00\x00k1q\x01X\x02\x00\x00\x00v1q\x02X\x02\x。。。
 
dic2 = pickle.loads(str_dic)
print(dic2)  # 字典 {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}

 

3、序列化写、读

import pickle
import time
 
struct_time = time.localtime(1000000000)
print(struct_time)
with  open('a.txt', 'wb') as f:
    pickle.dump(struct_time, f)
 
with  open('a.txt', 'rb') as f1:
    struct_time2 = pickle.load(f1)
    print(struct_time2.tm_year)

 

标签:Python,JSON,dic,json,字符串,序列化,data
From: https://www.cnblogs.com/Jessica-Jmm/p/17884219.html

相关文章

  • python的异步迭代器含义
    python的异步迭代器什么意思?什么是迭代器:迭代器是一种遵循迭代器协议的对象,可以被用在像for循环这样的迭代环境中。迭代器协议包含两个方法:__iter__():返回迭代器自身。__next__():返回迭代器的下一个元素。如果没有更多元素,则抛出StopIteration异常。就是这两个方法要包......
  • python-文件IO操作实例
    一、如何复制文件1、使用shutil模块来复制importshutil#导入shutil模块#定义源文件和目的文件的路径#图片src_path="E:/python/py/基础篇/01_基础/06_文件操作/图片.jpg"dst_path="D:/图片.jpg"#文本src1_path="E:/python/py/基础篇/01_基础/06_文件操作/......
  • 聪明办法学Python 选学02
    聪明办法学Python学习笔记调试Debug1.如何进行Python程序调试,包括调试理论和常用模块与库的使用调试的必要性在于程序可能出现不符合预期结果的情况调试的困难在于bug的触发原因多种多样,只能看到最终结果2.调试代码的基本思路和方法,包括利用print和断言来解决简单......
  • Python-xlrd读取Excel指定列a~b行数据并绘图
    importxlrd#读取Excel文件wb=xlrd.open_workbook(r"E:\PythonStudyAll\TestD20231130\1111.xlsx")data=wb.sheet_by_name('Sheet1')#定义要读取的列和行范围column_index_x=0#第一列的索引为0column_index_y=1#第一列的索引为0start_row=2#起始行索......
  • 聪明办法学python最后一集
    聪明办法学python最后一集关于程序员如何进行debug首先编程哲学机器永远是对的可以使用print进行一部分的实验(这也算是我经常使用的方法)断点调试就是从上向下执行时进行的判断bug位置断点这个地方,主要分为两步:「找断点」和「打断点」。找断点,就是你想调试的代码块的......
  • 【Python】【OpenCV】检测直线和圆
     重新理解一下Canny方法:参数:image:输入的图像。threshold1:第一个阈值,用于检测边缘的强度梯度的下限。threshold2:第二个阈值,用于检测边缘的强度梯度的上限。apertureSize:Sobel算子的大小,可选值为3、5、7,默认值为3。L2gradient:一个布尔值,指示是否使用更精确的L2范数计算梯度......
  • 聪明办法学python第5次笔记打卡
    Debugging关于debug的方法1.使用print语句打印变量的值2.使用assert语句判断程序的错误3.使用pdb模块,(Python的调试器)可以在程序中设置断点,单步调试4.使用IDE的内置调试器5.向人工智能求助常见错误1.缩进错误切忌tab和空格混用2.语法错误3.命令错误使用了未定义的函......
  • 聊聊如何为python程序 debug
    开始调试之前摆正心态一、调理论的简单介绍1、调试理论“软件”的两层含义·人类需求在信息世界的投影    理解错需求→bug·计算过程的精确(数学)描述     实现错误→bug2、调试困难的根本原因因为bug的触发经历了漫长的过程·需求→设计→代码(状态机)→F......
  • python notebook
    python(11.20--12.7)配置python环境:下载:anaconda在清华大学开源软件镜像站中选择合适的镜像进行下载。anaconda的存在和作用:要使用anaconda不妨先了解anaconda是什么,做什么。首先要知道,anaconda的存在必然有其存在的社会条件,现如今的python拥有众多版本,他们可以满足使用者不......
  • 聪明办法学python(5)
    聪明办法学python(5)debug调试方法print调试:将程序分段后添加print,锁定问题发生地assert调试:表达式是否成立ide调试:查看报错CV工程师:向人工智能求助常见报错缩进错误(IndentationError)切忌tab和空格混用语法错误(GrammarError)命令错误(CommandError)使用了未定义的函数......