Python数据序列化和固化存储的方式
作者:TomDeng66
数据序列化就是把内存中的数据结构(如列表、字典、对象) 转换成可以存储(如写入文件)或传输(如网络发送)的格式,本文给大家介绍Python数据序列化和固化存储的相关知识,感兴趣的朋友跟随小编一起看看吧
数据序列化就是把内存中的数据结构(如列表、字典、对象) 转换成可以存储(如写入文件)或传输(如网络发送)的格式;反序列化则是把这个格式还原回原来的数据结构。
在python中常见的序列化方式有:JSON、pickle
JSON 序列化
JSON 是跨语言的轻量级格式,适合和其他语言(如 Java、JavaScript)交互,但仅支持 Python 的基础数据类型:str、int、float、list、dict、bool、None。
核心函数
json.dumps():把数据结构转换成 JSON 字符串(内存中)json.dump():把数据结构直接写入文件(序列化到文件)json.loads():把 JSON 字符串还原成 Python 数据结构(反序列化)json.load():从文件读取 JSON 并还原(反序列化)
json.dumps()
import json
d1 = {'name':'Tomdeng','age':18}
# dict --> json
d1_str = json.dumps(d1)
print(d1) # {'name': 'Tomdeng', 'age': 18}
print(d1_str) # {"name": "Tomdeng", "age": 18}
print(type(d1_str)) <class 'str'>json.dump()
import json
d1 = {'name':'Tomdeng','age':18}
f = open("json_test.txt","w+")
json.dump(d1,f)
f.seek(0)
print(f.read()) # {"name": "Tomdeng", "age": 18}
f.close()json.loads()
import json
d1_str = '{"name":"Tomdeng","age":18}'
d1 = json.loads(d1_str)
print(d1_str) # {"name":"Tomdeng","age":18}
print(d1) # {'name': 'Tomdeng', 'age': 18}
print(type(d1)) # <class 'dict'>json.load()
import json
f = open("json_test.txt","r")
d1 = json.load(f)
print(d1) # {'name': 'Tomdeng', 'age': 18}
print(type(d1)) # <class 'dict'>
f.close()
注意:
JSON的键必须是字符串,Python 字典的非字符串键会被自动转成字符串;- 不支持 Python 的自定义对象、
tuple(会被转成列表)、set等类型。
pickle 序列化
pickle 是 Python 特有的序列化方式,支持所有 Python 数据类型(包括自定义对象、函数、类),但无法跨语言使用,且序列化后的是二进制数据。
核心函数
pickle.dumps():转成二进制字符串pickle.dump():写入文件(二进制模式)pickle.loads():还原二进制字符串pickle.load():从二进制文件还原
pickle.dumps()
import pickle
d1 = {'name':'Tomdeng','age':18}
d1_binary = pickle.dumps(d1)
print(type(d1_binary))
pickle.dump()
import pickle
d1 = {'name':'Tomdeng','age':18}
f = open("pickle_test","wb")
pickle.dump(d1,f)
f.close()
pickle.loads()
import pickle
d1 = {'name':'Tomdeng','age':18}
d1_binary = pickle.dumps(d1)
d2 = pickle.loads(d1_binary)
print(d2) # {'name': 'Tomdeng', 'age': 18}
print(type(d2)) # <class 'dict'>
pickle.load()
import pickle
f= open("pickle_test","rb")
d1 = pickle.load(f)
print(d1) # {'name': 'Tomdeng', 'age': 18}
print(type(d1)) # <class 'dict'>
固化存储
通过open("file_name","type")来对文件进行操作,将内存中的数据保存在磁盘中(内存中的数据当程序结束或主机关闭时将被释放)
同时可以通过encoding字符集
参数
- r 只读
- w 覆盖写
- a 追加写
r+ / w+ /a+ 的区别
| 模式 | 文件不存在 | 文件已存在 | 初始指针位置 | 写入行为 | 关键特点 |
|---|---|---|---|---|---|
r+ | 报错 | 保留原有内容 | 文件开头 | 覆盖指针位置的内容 | 适合「读取 + 修改」已有文件,不会清空原内容 |
w+ | 创建新文件 | 清空原有内容 | 文件开头 | 从开头写入(覆盖) | 适合「先写后读」,但会清空原文件 |
a+ | 创建新文件 | 保留原有内容 | 文件末尾 | 始终追加到末尾 | 适合「读取 + 追加」,写入不会覆盖原有内容 |
默认r/w/a后面有一个文本类型为t(普通文本),如果需要操作的文件是二进制文本,要在后面添加b,如“rb”
相关方法
# fp.read(5) 按照字节数开始读 读和写都是在文件指针后开始读写
# fp.seek(0) 重置光标位置为开头
# fp.readline() 从光标的位置读到行尾
# fp.readlines() 默认从光标位置读到文件末尾,按行存放到列表中
# fp.readlines(4) 读取到累计字符数 > 4的行
# for i in fp:
print("一行一行读",i )
# fp.close() 关闭打开的文件,释放资源
注意:
with open(…) as f:是文件操作的最优写法,自动关闭文件句柄,无需手动调用f.close()
实例
with open("user.txt","r+",encoding="utf-8") as f:
print(f.readlines())
输出
['{"tom": {"username": "tom", "password": "123456", "age": "20", "sex": "man"}}']
练习
登录系统
1.注册 输入账号和密码 年龄,性别
判断是否存在
2.登录 输入账号和密码
判断账户是否存在,密码是否正确
3.退出解题:
import json
fr = open("user.txt","r")
str = fr.read()
fr.close()
if str != "" :
d1 = json.loads(str)
else:
d1 = dict()
while True:
choice = input("1.注册\t2.登录\t3.退出\n")
match choice:
case "1":
username,password,age,sex = input("请输入用户名,密码,年龄,性别\n").split()
if username in d1:
print("用户已存在")
else:
d1[username] = {"username":username,"password":password,"age":age,"sex":sex}
case "2":
username,password = input("请输入用户名和密码\n").split()
if username not in d1:
print("用户不存在\n")
elif d1[username]["password"] != password:
print("密码错误\n")
else:
print("登录成功")
case "3":
str1 = json.dumps(d1)
fw = open("user.txt", "w")
fw.write(str1)
fw.close()
print("退出成功")
break到此这篇关于Python数据序列化和固化存储的方式的文章就介绍到这了,更多相关python数据序列化和固化存储内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
