前言

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()

数据存储在本地的状态

python的持久层 python持久化存储_数据

  1. 通过给print指定file参数后,原本应在控制台输出的内容,现在变成了字符串形式存储到了本地
  2. 使用input读取内容时,需用sys.stdin指定读取的文件对象,每input一次则为读取一行
  3. 方法比较另类,也存在一些问题,比如:对象是无法存储的,实际作用是控制台打印什么那么文件就会存储什么,因此是无法保存对象的,而且使用eval本来就是十分不安全的做法

pickle持久化方案

pickle作为python专用的序列化手段可以将对象完整的转化为字节流,存储到本地,这不失为一种非常好的数据持久化方案
代码演示

import pickle
a = {
    'name': 'yxhpy',
    'age': 21,
    'pay': 6000
}
f = open('a', 'wb')
pickle.dump(a, f)
f.close()

python的持久层 python持久化存储_持久化_02


我们的数据会以字节流的方案存储在本地,分为3个文件

f = open('a', 'rb')
obj = pickle.load(f)
print(obj['name'])
f.close()

反序列化也是非常的简单,只需要将文件对象传入load中即可还原出我们原本的数据

更高级的封装Shelves

其实Shelvespickle非常的类似且,文件也能存储的文件结构也非常的类似,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之间的传输),也了解到了pickleshelve等字节流存储方案,这些方案都帮助我们实现本地的数据持久化