专栏首页Python空间听说你还不会将数据存入文件?

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

本文字数:2149 字 阅读本文大概需要:6 分钟

写在之前

在前面的文章中,我们学过用 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 更像是数据库了。不过它还不是真正的数据库,真正的数据库还在后面。我会向大家再介绍几种保存数据的方式,另外还有对数据的增删改查等操作,尽情期待。

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

The end。

本文分享自微信公众号 - Python空间(Devtogether),作者:Rocky0429

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-09-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 突发!Nginx 之父被拘留,原因竟然是“接私活儿”?

    俄罗斯警方今天突击搜查了 Nginx 在莫斯科的办事处,扣押了公司的设备,并对企业员工进行拘留讯问。

    Rocky0429
  • 在家快发霉了?数据告诉你,网友们都怎么打发时间

    疫情正在持续,春节假期也延长了。为了响应钟南山院士“不要乱跑”的号召,多出的假期,就是在考验我们对生活的想象力和创造力——原来几天没遛的宠物狗是这个感觉,原来在...

    Rocky0429
  • 面试必备 | 带你彻底搞懂 Python 生成器。

    Python 的高级语言特性一直是我们学习 Python 的一个难点,大部分人并没有做到熟练的掌握,甚至去学习它都感觉很困难,「生成器」作为其中甚是有用的特性之...

    Rocky0429
  • GAN对人脸图像算法产生了哪些影响?

    人脸图像是整个图像领域里面研究人员最多,应用最广的一个方向。GAN作为时下最新兴的深度学习模型,在人脸图像领域里已经颇有建树,今天咱们就聊聊GAN对人脸图像算法...

    马上科普尚尚
  • 【杂谈】有三AI知识星球最近都GAN了哪些内容?

    跨年龄的人脸识别和验证是一个非常具有挑战性的问题,如果能对年龄进行归一化,去除年龄因素的干扰,将大大提升跨年龄人脸识别的精度。

    用户1508658
  • PCI规划工具

    工具用的巧也可做为区域性的PCI重规划,对于零星的新开站点与PCI优化还是挺实用,工具界面如下:

    用户6184845
  • LBP特征

    LBP指局部二值模式,英文全称:Local Binary Pattern,是一种用来描述图像局部特征的算子,LBP特征具有灰度不变性和旋转不变性等显著优点。它是...

    闪电gogogo
  • 构建复杂应用的神器,FBroadcast

    迄今为止,FWidget 已经收到了来自开发者们的 1215 个 Star,感谢开发者们的支持,这对 FWidget 来说至关重要。

    用户1907613
  • UML相关工具一览(20190512 更新)

    http://www.umlchina.com/Tools/search.aspx

    用户6288414
  • Visual Studio Code(CS code)你们都在用吗?或许你们需要看一下这篇博文

    在前端开发中,有一个非常好用的工具,Visual Studio Code,简称VS code。

    Dawnzhang

扫码关注云+社区

领取腾讯云代金券