python序列化与反序列化

简介: python序列化与反序列化

ce2f77d72bf84b19b3f054af4214c8f3.png

Hello,大家好,我是景天,今天来根大家聊一聊python的序列化与反序列化

Python语言的序列化与反序列化可用pickle和json模块

1、pickle 序列化/反序列化模块

pickle模块只能在python中使用,python中几乎所有的数据类型(列表,字典,集合,类等)都可以用pickle来序列化,

pickle序列化后的数据,可读性差,人一般无法识别。

import pickle

序列化: 把不能够直接存储在文件中的数据变得可存储

反序列化: 把存储在文件中的数据拿出来恢复成原来的数据类型

php

serialize

unserialize

所有的数据类型都通过pickle模块进行序列化

lst = [1,2,3]
#错误案例, 文件不能直接存储容器 ,数字,图片,音视频等类型数据,  文件只能存储字符串和字节流

with open("lianxi1.txt",mode="w",encoding="utf-8") as fp:
    fp.write(1)

1 dumps 把任意对象序列化成一个bytes

res = pickle.dumps(lst)
print(res , type(res))

序列化之后,就可以将数据存储在文件,但要使用字节流模式

#函数可以序列化么? 可以

def func():
    print("我是func函数")
res = pickle.dumps(func)
print(res , type(res))

#迭代器可以序列化么? 可以

it = iter(range(10))
res = pickle.dumps(it)
print(res , type(res))

2 loads 把任意bytes反序列化成原来数据

res2 = pickle.loads(res)
print(res2 , type(res2))

3 直接跟文件有关的操作

1 dump 把对象序列化后写入到file-like Object(即文件对象)

dump既可以直接将数据对象序列化,也可以将字节流序列化写入文件对象

lst = [1,2,3]
with open("lianxi1.txt",mode="wb") as fp:
    pickle.dump(lst,fp)

2 load 把file-like Object(即文件对象)中的内容拿出来,反序列化成原来数据

with open("lianxi1.txt",mode="rb") as fp:
    res2 = pickle.load(fp)
print(res2 , type(res2))

3 dumps 和 loads 对文件进行写入读取字节流操作

#写入字节流
with open("lianxi2.txt",mode="wb+") as fp:
    res1 = pickle.dumps(lst)
    fp.write(res1)

#读取字节流
with open("lianxi2.txt",mode="rb+") as fp:
    bytes_str = fp.read()
    res = pickle.loads(bytes_str)
print(res , type(res2))

#dumps,loads和dump,load使用方式:

如果应用场景和文件有关,使用dump,load

如果没关,使用dumps,loads

2、json 序列化/反序列化模块

import json

json格式的数据, 所有的编程语言都能识别,本身是字符串 一共能存8个类型

能够转化的类型有要求: int float bool str list tuple dict Non

json 主要应用于传输数据 , 序列化成字符串

pickle 主要应用于存储数据 , 序列化成二进制字节流

集合和complex格式 不支持json序列化

1 json 基本用法

#json => dumps 和 loads

参数

sort_keys =True 是告诉编码器按照字典排序(a到z)输出。如果是字典类型的python对象,就把关键字按照字典排序

“”“ensure_ascii=False 可以包含非ASCII字符,显示中文 sort_keys=True 字典按键排序”“”

如果不设置ensure_ascii=False 默认中文以unicode的编码显示

dic = {"name":"梁新宇","sex":"野味","age":22,"family":["爸爸","妈妈","姐姐"]}
res = json.dumps(dic,ensure_ascii=False,sort_keys=True)
print(res , type(res))

dic = json.loads(res)
print(dic , type(dic))

dumps 序列化,将其它数据类型转化为字符串

loads 反序列化,将字符串还原成原有数据类型

dumps和loads写入文件和读取:

json.dumps() 方法 将一个Python数据结构转换为JSON字符串

常用参数如下:

这样的格式一般都不优美,当数据很多的时候,看得就不是很直观方便。

可以使用indent=4 参数来对json进行数据格式化输出,会根据数据格式缩进显示,读起来更加清晰

用法如下

import json

data = [{"name":"张","age":20},{"name":"王","age":21}]
json_str=json.dumps(data, indent=4, ensure_ascii=False)
print(json_str)

separators=(',', ':')   dumps出来的字典 值的前面不带空格
 

#json => dump 和 load 和文件相关

with open("lianxi3.json",mode="w",encoding="utf-8") as fp:
    json.dump(dic,fp,ensure_ascii=False)
with open("lianxi3.json",mode="r",encoding="utf-8") as fp:
    dic = json.load(fp)
print(dic , type(dic))

2 json 和 pickle 之间的区别

#1.json

json 连续dump数据 , 但是不能连续load数据 , 是一次性获取所有内容进行反序列化.

dic1 = {"a":1,"b":2}
dic2 = {"c":3,"d":4}
with open("lianxi4.json",mode="w",encoding="utf-8") as fp:
    json.dump(dic1,fp)
    fp.write("\n")
    json.dump(dic2,fp)
    fp.write("\n")

可以连续dump

不能连续load,超过一次dump的数据,load就会报错。是一次性获取所有数据 , error。load是一次性地将所有数据放在一块反序列化,解码解不出来

with open("lianxi4.json",mode="r",encoding="utf-8") as fp:
    dic = json.load(fp)


#解决办法 loads(分开读取)。前提是数据必须换行,不换行loads也不行
with open("lianxi4.json",mode="r",encoding="utf-8") as fp:
    for line in fp:
        dic = json.loads(line)
        print(dic,type(dic))

写入文件的数据不换行,用loads也不行

#2.pickle

import pickle
#pickle => dump 和 load
**pickle 连续dump数据,也可以连续load数据**
with open("lianxi5.pkl",mode="wb") as fp:
    pickle.dump(dic1,fp)
    pickle.dump(dic2,fp)
    pickle.dump(dic1,fp)
    pickle.dump(dic2,fp)

#方法一

with open("lianxi5.pkl",mode="rb") as fp:
    dic1 = pickle.load(fp)
    dic2 = pickle.load(fp)
    print(dic1)
    print(dic2)

pickle的dump几次,就load几次,可以连续load不报错,是因为字节流有结束符

#方法二 (扩展)

try … except … 把有可能报错的代码放到try代码块中,如果出现异常执行except分支,来抑制报错

#一次性拿出所有load出来的文件数据

try:
    with open("lianxi5.pkl",mode="rb") as fp:
        
        while True:
            dic = pickle.load(fp)
            print(dic)
except:
    pass

总结:

son 和 pickle 两个模块的区别:

(1)json序列化之后的数据类型是str,所有编程语言都识别,

但是仅限于(int float bool)(str list tuple dict None)

json不能连续load,只能一次性拿出所有数据

(2)pickle序列化之后的数据类型是bytes,用于数据存储

所有数据类型都可转化,但仅限于python之间的存储传输.

pickle可以连续load,多套数据放到同一个文件中

pickle自己用可以,用的前提是大家都支持pickle


相关文章
|
3月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
15天前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
25天前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
1月前
|
存储 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第9天】在Java的世界里,对象序列化是连接数据持久化与网络通信的桥梁。本文将深入探讨Java对象序列化的机制、实践方法及反序列化过程,通过代码示例揭示其背后的原理。从基础概念到高级应用,我们将一步步揭开序列化技术的神秘面纱,让读者能够掌握这一强大工具,以应对数据存储和传输的挑战。
|
1月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第3天】在Java编程的世界里,对象序列化与反序列化是实现数据持久化和网络传输的关键技术。本文将深入探讨Java序列化的原理、应用场景以及如何通过代码示例实现对象的序列化与反序列化过程。从基础概念到实践操作,我们将一步步揭示这一技术的魅力所在。
|
25天前
|
存储 缓存 NoSQL
一篇搞懂!Java对象序列化与反序列化的底层逻辑
本文介绍了Java中的序列化与反序列化,包括基本概念、应用场景、实现方式及注意事项。序列化是将对象转换为字节流,便于存储和传输;反序列化则是将字节流还原为对象。文中详细讲解了实现序列化的步骤,以及常见的反序列化失败原因和最佳实践。通过实例和代码示例,帮助读者更好地理解和应用这一重要技术。
24 0
|
2月前
|
JSON fastjson Java
niubility!即使JavaBean没有默认无参构造器,fastjson也可以反序列化。- - - - 阿里Fastjson反序列化源码分析
本文详细分析了 Fastjson 反序列化对象的源码(版本 fastjson-1.2.60),揭示了即使 JavaBean 沲有默认无参构造器,Fastjson 仍能正常反序列化的技术内幕。文章通过案例展示了 Fastjson 在不同构造器情况下的行为,并深入探讨了 `ParserConfig#getDeserializer` 方法的核心逻辑。此外,还介绍了 ASM 字节码技术的应用及其在反序列化过程中的角色。
77 10
|
2月前
|
存储 XML JSON
用示例说明序列化和反序列化
用示例说明序列化和反序列化
|
2月前
|
存储 Java 开发者
Java编程中的对象序列化与反序列化
【9月更文挑战第20天】在本文中,我们将探索Java编程中的一个核心概念——对象序列化与反序列化。通过简单易懂的语言和直观的代码示例,你将学会如何将对象状态保存为字节流,以及如何从字节流恢复对象状态。这不仅有助于理解Java中的I/O机制,还能提升你的数据持久化能力。准备好让你的Java技能更上一层楼了吗?让我们开始吧!
|
2月前
|
存储 Java
Java编程中的对象序列化与反序列化
【9月更文挑战第12天】在Java的世界里,对象序列化与反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何通过实现Serializable接口来标记一个类的对象可以被序列化,并探索ObjectOutputStream和ObjectInputStream类的使用,以实现对象的写入和读取。我们还将讨论序列化过程中可能遇到的问题及其解决方案,确保你能够高效、安全地处理对象序列化。
下一篇
无影云桌面