前言
Python中不管你是list
,str
,dict
等数据,我们都只能在内存中使用,一旦软件发生意外,或数据未及时保存,就会导致我们的数据无法恢复,于是我们这节准备了3个持久化数据的方案,其中包括一些python的进阶用法
什么?Print也能用来存储?Input读取?
是的你没有看错,在普通的教程中print
我们只是用来打印输出的,而input
是用来输入的,而用于数据的持久化中可以用来存储数据
演示
a = {
'name': 'yxhpy',
'age': 21,
'pay': 6000
}
f = open('a', 'w')
print(a, file=f)
f.close()
f = open('a', 'r')
import sys
sys.stdin = f
obj = eval(input())
print(obj['name'])
f.close()
数据存储在本地的状态
- 通过给
print
指定file
参数后,原本应在控制台输出的内容,现在变成了字符串形式存储到了本地 - 使用
input
读取内容时,需用sys.stdin
指定读取的文件对象,每input
一次则为读取一行 - 方法比较另类,也存在一些问题,比如:对象是无法存储的,实际作用是控制台打印什么那么文件就会存储什么,因此是无法保存对象的,而且使用
eval
本来就是十分不安全的做法
pickle持久化方案
pickle作为python专用的序列化手段可以将对象完整的转化为字节流,存储到本地,这不失为一种非常好的数据持久化方案
代码演示
import pickle
a = {
'name': 'yxhpy',
'age': 21,
'pay': 6000
}
f = open('a', 'wb')
pickle.dump(a, f)
f.close()
我们的数据会以字节流的方案存储在本地,分为3个文件
f = open('a', 'rb')
obj = pickle.load(f)
print(obj['name'])
f.close()
反序列化也是非常的简单,只需要将文件对象传入load
中即可还原出我们原本的数据
更高级的封装Shelves
其实Shelves
和pickle
非常的类似且,文件也能存储的文件结构也非常的类似,shelves
就是将dict
,open
,pickle
封装在一起的产物
代码实验
import shelve
class Person(object):
def __init__(self, name, age, pay):
self.name = name
self.age = age
self.pay = pay
def set_pay(self, money):
self.pay = money
def __str__(self):
return 'name:{} age:{} pay:{}'.format(self.name, self.age, self.pay)
persons = shelve.open('persons')
persons['yxhpy'] = Person('yxhpy', 21, 4000)
persons.close()
persons = shelve.open('persons')
print(persons['yxhpy'])
persons.close()
在上述例子中我们用一个文件用来管理人,只需输入对应的key
即可非常方便的创建和找到对应的人,相比pickle
简化了非常多
总结
本节我们不仅了解到了print
,input
的特殊用法,也对python特有的序列化方案进行了了解,(这里的特有是指仅仅支持python之间的传输),也了解到了pickle
,shelve
等字节流存储方案,这些方案都帮助我们实现本地的数据持久化