前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >听说你还不会将数据存入文件?

听说你还不会将数据存入文件?

作者头像
编程文青李狗蛋
发布2019-11-07 15:48:35
3540
发布2019-11-07 15:48:35
举报
本文字数:2149 字 阅读本文大概需要:6 分钟

写在之前

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

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

pickle

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

代码语言:javascript
复制
>>> 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() 方法的对象。

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

代码语言:javascript
复制
>>> integer = pickle.load(open('test.dat','rb'))
>>> integer
[1, 2, 3, 4, 5]

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

shelve

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

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

代码语言:javascript
复制
>>> 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()

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

代码语言:javascript
复制
>>> 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 交互模式的便利之处:

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

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

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

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

代码语言:javascript
复制
>>> 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 更像是数据库了。不过它还不是真正的数据库,真正的数据库还在后面。我会向大家再介绍几种保存数据的方式,另外还有对数据的增删改查等操作,尽情期待。

如果你觉得本篇文章对你有所帮助的话,走之前请帮忙点个赞,如果你有什么问题的话,欢迎在后台或者加我的微信跟我联系。

The end。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-09-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python空间 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档