听说你还不会将数据存入文件?(pickle & shelve)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013486414/article/details/85686521

写在之前

在前面的文章中,我们学过用 Python 如何读写文件。程序执行结果,就是产生一些数据,一般情况下,这些数据要保存到磁盘中,最简单的方法就是写入到某个文件。但是呢,这种文件又不仅仅是某种 CSV 文件,而是专门存取数据的文件,并且各种不同格式的数据存储文件操作方式略有差别。

简而言之,就是要将存储的对象格式化(也有叫作序列化的),才好好存取。这有点类似集装箱的作用。

pickle

pickle 是标准库中的一个模块,在 Python2 中还有一个 cpickle,两者的区别就是后者更快。而在 Python3 中,只需要 import pickle 即可,因为它已经在 Python3 中具备了 Python2 中的 cpickle 同样的性能。

>>> import pickle
>>> integer = [1,2,3,4,5]
>>> f = open('test.dat','wb')
>>> pickle.dump(integer,f)
>>> f.close()

用 pickle.dump(integer,f) 将数据 integer 保存到了文件 test.dat 中。如果你想要打开这个文件看里面的内容,可能会有点失望,因为对我们非常不友好,但是它对计算机是友好的。这个步骤可以称之为将对象「序列化」。用到的方法是:pickle.dump(obj,file[,protocol]):

  • obj:序列化对象,在上面的例子中是一个列表,它是 Python 默认的数据类型,也可以使用自己定义类型的对象。

  • file:要写入的文件,可以更广泛的理解为拥有 write() 方法的对象。

以上很简单的就实现了数据的序列化,即写入。另外一种常用的操作就是读取文件中的数据,也称之为「反序列化」。

>>> integer = pickle.load(open('test.dat','rb'))
>>> integer
[1, 2, 3, 4, 5]

上述就是 pickle 的基本应用,如果大家有意继续深入了解的话,可以阅读一下官网的文档。

shelve

上面的 pickle 模块已经表现出它足够好的一面了。不过由于数据的复杂性,pickle 只能完成一部分工作,在其它更复杂的情况下,pickle 就显得稍微有些麻烦。于是,shelve 就横空出世。

同样,shelve 模块也是标准库中的。首先我们来看一下其基本的读写操作:

>>> import shelve
>>> s = shelve.open('test.db')
>>> s['name'] = 'rocky'
>>> s['like'] = 'python'
>>> s['age'] = 23
>>> s['content'] = {'first':'good good study','second':'day day up'}
>>> s.close()

上述代码我们完成了数据写入的过程,其实,你再仔细看的话,这很接近数据库的样式了。下面我们来看一下读操作:

>>> s = shelve.open('test.db')
>>> name = s['name']
>>> print(name)
rocky
>>> content = s['content']
>>> print(content)
{'first': 'good good study', 'second': 'day day up'}

看到上面输出的内容,你一定会想到,这个可以用 for 语句来读取。既然想到了那我们就用代码来测试一下,这就是 Python 交互模式的便利之处:

>>> for k in s:
...    print(k, s[k])
... 
name rocky
like python
age 23
content {'first': 'good good study', 'second': 'day day up'}

不管是写操作还是读操作,看起来似乎都简化了。所建立的对象被变量 s 引用,就如同字典一样,可称之为「类字典对象」(关于类字典后面会经常被提及)。所以,我们可以如同操作字典那样来操作它。但是,小心有坑!

>>> f = shelve.open('test.db')
>>> f['author'] = ['rocky0429']
>>> f['author']
['rocky0429']
>>> f['author'].append('snow') #试图增加一个,操作之后没有报错
>>> f['author'] #坑就在这
['rocky0429']
>>> f.close()

上面的结果并没有增加进去,下面我们再用 for 循环一下:

>>> f = shelve.open('test.db')
>>> for k,v in f.items():
...    print(k,':',v)
... 
name : rocky
like : python
age : 23
content : {'first': 'good good study', 'second': 'day day up'}
author : ['rocky0429']

shelve 这么看起来更像是数据库了。

写在之后

上面我们说,shelve 更像是数据库了。不过它还不是真正的数据库,真正的数据库还在后面。我会向大家再介绍几种保存数据的方式,另外还有对数据的增删改查等操作,尽情期待。

更多内容,欢迎关注公众号「Python空间」,期待和你的交流。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/u013486414/article/details/85686521