序列化模块
一、什么是序列化模块
将python或者其他语言的数据类型转换成字符串类型
序列:指的是字符串
二、序列化与反序列化
2.1 序列化:serializable
将对象的状态信息转为可以存储或可以通过网络输的过程
- 其他数据类型——>字符串——>文件中
2.2 反序列化:
从存储区域读取反序列化对象的状态,重新创建该对象
- 文件中——>字符串——>其他数据类型
三、实现序列化的两种模块
3.1 json(第三方的)
json
是一个“第三方”的特殊数据格式
python的Json模块序列化与反序列化的过程分别是 encoding和 decoding
encoding:把一个Python对象编码转换成Json字符串
decoding:把Json格式字符串解码转换成Python对象
3.1.1 为什么要使用json
为了让不同编程语言之间数据可以共享
3.1.2 json的序列化流程
序列化流程:
python数据类型——>json数据类型——>字符串——>文件中
ps:在json中,所有的字符串都是双引号
反序列化流程:
文件中——>字符串——>json数据类型——>python数据类型
3.1.3 json的语法
import json
json.dumps(f.write()) # 序列化
json.loads(f.read()) # 反序列化
# 直接传入f的句柄,省略了f.write
json.dump(f) # 序列化,并将数据内容写入文件,内部实现f.write()
# 直接传入f的句柄,省略了f.read
json.load(f) # 反序列化,从文件中读取数据,内部实现f.read()
# ps: 保存为json数据时,用.json作为文件的后缀名
3.1.4 json的例子
列表转换:
import json
# 给定一个列表
list1 = ['123', '321']
# ensure_ascii默认为True,改为False,可以在控制台看到中文,否则看到的是bytes类型数据
json_str = json.dumps(list1, ensure_ascii=False) # dumps,将列表序列化
print(json_str)
print(type(json_str)) # 是一个字符串类型
["123", "321"]
<class 'str'>
元组转换:
import json
tuple1 = ('张全蛋', '李小花')
json_str = json.dumps(tuple1, ensure_ascii=False)
print(json_str)
print(type(json_str))
["张全蛋", "李小花"]
<class 'str'>
字典转换:
import json
dic1 = {
'name': 'tank',
'age': 17
}
json_str = json.dumps(dic1, ensure_ascii=False)
print(json_str)
print(type(json_str))
{"name": "tank", "age": 17}
<class 'str'>
反序列化
import json
dic1 = {
'name': 'tank',
'age': 17
}
json_str = json.dumps(dic1, ensure_ascii=False)
python_data = json.loads(json_str) # 将文件中的字符串读出来,并还原成字典
print(python_data)
print(type(python_data))
{'name': 'tank', 'age': 17}
<class 'dict'>
3.1.5 注册功能
以保证用户的信息是以字典的形式存入文件中
import json
def json_info():
user_name = input('请输入用户名:').strip()
if user_name.isalnum():
while True:
password = input('请输入密码:').strip()
re_password = input('请再次输入密码确认:').strip()
if password != re_password:
print('两次密码不一致!')
continue
if password == re_password:
# 定义字典,用于后面传值
info_dic = {
'name': user_name,
'pwd': password
}
# 将字典序列化
json_str = json.dumps(info_dic, ensure_ascii=False)
# 注意: 保存json数据时,用.json作为文件的后缀名
with open('user.json', mode='a', encoding='UTF-8') as wf:
wf.write(json_str)
print('注册成功!')
break
else:
print('请输入数字或者字母!')
json_info()
3.1.6 dump和load
import json
user_dic = {
'username': 'tank',
'password': 123
}
f = open('user2.json', 'w', encoding='utf-8')
json.dump(user_dic, f)
f.close()
with open('user3.json', 'w', encoding='utf-8') as f:
json.dump(user_dic, f)
with open('user3.json', 'r', encoding='utf-8') as f:
user_dic = json.load(f)
print(user_dic)
print(type(user_dic))
3.2 pickle(python的)
3.2.1 什么是pickle模块
pickle是一个python自带的序列化模块
3.2.2 pickle模块的优缺点
优点:
- 可以支持python中所有的数据类型
- 可以直接存“bytes类型”的数据,pickle存取速度更快
缺点:(致命)
- 只能支持python去使用,不能跨平台
3.2.3 pickle模块的语法
- 写
pickle.dump()
- 读
pickle.load()
3.2.4 pickle的例子
写的例子
import pickle
set1 = {'tank', 'sean', 'json', '大饼'}
# 写 dump
# 文件的后缀应该是.pickle
with open('teacher.pickle', 'wb') as wf:
pickle.dump(set1, wf)
读的例子
import pickle
with open('teacher.pickle', 'rb') as rf:
python_set = pickle.load(rf)
print(python_set)
四、json和pickle对比
json:
优点:json可以跨平台,支持其他编程语言,
缺点:支持python的基本数据类型(string、unicode、int、float、list、tuple、dict)
pickle:
优点:支持python全部的数据类型,包括对象,可以直接存“bytes类型”的数据,pickle存取速度更快
缺点:不能跨平台,只支持python编程语言