模块学习之json、pickle模块
【一】序列化和反序列化
【1】什么是序列化
- 将原本的字典、列表等内容转换成一个字符串的过程就叫做序列化
【2】为什么要有序列化
-
比如,我们在python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给?
- 现在我们能想到的方法就是存在文件里
- 然后另一个
python
程序再从文件里读出来。
-
但是我们都知道
- 对于文件来说是没有字典这个概念的
- 所以我们只能将数据转换成字典放到文件中。
-
你一定会问,将字典转换成一个字符串很简单,就是str(dic)就可以办到了
- 为什么我们还要学习序列化模块呢?
-
没错序列化的过程就是从
dic
变成str(dic)
的过程。 -
现在你可以通过str(dic)
- 将一个名为
dic
的字典转换成一个字符串,
- 将一个名为
-
但是你要怎么把一个字符串转换成字典呢?
-
聪明的你肯定想到了
eval()
,如果我们将一个字符串类型的字典str_dic
传给eval
,就会得到一个返回的字典类型了。 -
eval()函数十分强大,但是eval
是做什么的?
- 官方demo解释为:
- 将字符串
str
当成有效的表达式来求值并返回计算结果。 BUT!
强大的函数有代价。安全性是其最大的缺点。
-
-
想象一下
- 如果我们从文件中读出的不是一个数据结构,
- 而是一句"删除文件"类似的破坏性语句
- 那么后果实在不堪设设想。 而使用
eval
就要担这个风险。
-
所以
- 我们并不推荐用
eval
方法来进行反序列化操作(将str
转换成python
中的数据结构)
- 我们并不推荐用
【3】序列化的目的
- 以某种存储形式使自定义对象持久化,将对象从一个地方传递到另一个地方,使程序更具维护性。
【二】序列化模块json
【1】导入模块
import json
【2】序列化方法(loads)
- 将json字符串转换为Python对象
import json
json_str = '{"name": "ligo", "age": 18, "city": "Shang Hai"}'
python_obj = json.loads(json_str)
print(python_obj,type(python_obj))
# {'name': 'ligo', 'age': 18, 'city': 'Shang Hai'} <class 'dict'>
# 注释:将 JSON 字符串解码为 Python 字典
【2】反序列化(dumps)
- 将Python对象转换为json字符串
- json转换完的字符串类型的字典中的字符串是由
""
表示的
import json
python_obj = {"name": "ligo", "age": 18, "city": "Shang Hai"}
json_str = json.dumps(python_obj, indent=2)
print(json_str, type(json_str))
# {
# "name": "ligo",
# "age": 18,
# "city": "Shang Hai"
# } <class 'str'>
# 注释:将 Python 字典编码为漂亮格式的 JSON 字符串
【3】写入文件(dump)
(1)不指定参数
- 接收一个文件句柄
- 直接将
字典
转换成json字符串
写入文件 - 会在本地生成一个
data.json
的文件在里面有上面写入的数据
import json
python_obj = {"name": "ligo", "age": 18, "city": "New York"}
with open("data.json", "w") as json_file:
# indent : 控制缩进的空格数或字符串
json.dump(python_obj, json_file, indent=2)
# 注释:将 Python 字典写入 JSON 文件
(2)指定参数编码(ensure_ascii)
import json
python_obj = {"name": "星河", "age": 18, "city": "Shang Hai"}
# 写文件时指定编码格式为 utf-8 ---> 这样在json文件中存储的中文才是正常的中文,否则是二进制数据
with open("data.json", "w",encoding='utf-8') as json_file:
# ensure_ascii=False 上面指定编码格式后需要将 默认使用 ascii 这个选项设置为否
json.dump(python_obj, json_file,indent=2,ensure_ascii=False)
# 注释:将 Python 字典写入 JSON 文件
# 未指定 encoding='utf-8'
{
"name": "\u86a9\u68a6",
"age": 18,
"city": "Shang Hai"
}
# 指定 encoding='utf-8'
{
"name": "星河",
"age": 18,
"city": "Shang Hai"
}
(3)指定参数分隔符(separators)
import json
python_obj = {"name": "星河", "age": 18, "city": "Shang Hai"}
with open("data.json", "w", encoding='utf-8') as json_file:
# 将默认的分隔符 , 替换成我们的指定分隔符 -
# 将默认的分隔符 : 替换成我们的指定分隔符 ;
json.dump(python_obj, json_file, indent=2, ensure_ascii=False, separators=(',', ';'))
# 注释:将 Python 字典写入 JSON 文件
{
"name";"星河"-
"age";18-
"city";"Shang Hai"
}
【4】读文件数据(load)
- 接收一个文件句柄
- 直接将文件中的
json字符串
转换成数据结构
返回
import json
# 可以选择指定读取数据的默认编码格式
with open("data.json", "r",encoding='utf-8') as json_file:
python_obj = json.load(json_file)
print(python_obj, type(python_obj))
# {'name': '星河', 'age': 18, 'city': 'Shang Hai'} <class 'dict'>
# 注释:从 JSON 文件中读取数据并转为 Python 字典
【三】序列化模块pickle
- pickle只对python对象生效,用于python特有的类型和数据类型之间的转换
【1】序列化方法(dumps)
# 将Python对象转换为二进制数据
import pickle
user_dict = {'username': 'ligo', 'password': 123}
str_user_dict = pickle.dumps(user_dict)
print(str_user_dict,type(str_user_dict))
#b'\x80\x04\x95$\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x08username\x94\x8c\x04ligo\x94\x8c\x08password\x94K{u.' <class 'bytes'>
【2】反序列化方法(loads)
# 将二进制的Python数据转换为Python对象
import pickle
user_dict = {'username': 'ligo', 'password': 123}
str_user_dict = pickle.dumps(user_dict)
print(str_user_dict,type(str_user_dict))
# b'\x80\x04\x95$\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x08username\x94\x8c\x04ligo\x94\x8c\x08password\x94K{u.' <class 'bytes'>
pickle_user_dict = pickle.loads(str_user_dict)
print(pickle_user_dict,type(pickle_user_dict))
# {'username': 'ligo', 'password': 123} <class 'dict'>
【3】写入文件(dump)
import pickle
def save_data(data):
with open('data.txt','wb')as fp:
pickle.dump(data,fp)
def main():
print("你真是太棒了!")
save_data(data=main)
# 写入到文件中的是一堆乱码
# �� �__main__��main���..
【4】读取文件数据(load)
import pickle
def read_data():
with open('data.txt','rb') as fp:
data = pickle.load(fp)
print(data)
def save_data(data):
with open('data.txt','wb')as fp:
pickle.dump(data,fp)
def main():
print("你真是太棒了!")
save_data(data=main)
read_data()
# <function main at 0x0000019FF2A29870>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY