暑期Stata培训班招生啦!!!
接力线上的网课培训,我们在今夏又开始新一轮的线下培训啦!
8月4日至12日
,爬虫俱乐部期待与您的相遇!培训具体内容详见推文《
暑期Stata编程技术定制培训班
》。
有问题,不要怕!点击推文底部“
阅读原文
”下载爬虫俱乐部用户问题登记表并按要求填写后发送至邮箱
[email protected]
,我们会及时为您解答哟~
喜大普奔~爬虫俱乐部的github主站正式上线了!我们的网站地址是:
https://stata-club.github.io
,粉丝们可以通过该网站访问过去的推文哟~
好消息
:爬虫俱乐部即将推出研究助理供需平台,如果您需要招聘研究助理(Research Assistant or Research Associate),可以将您的需求通过我们的公众号发布;如果您想成为一个RA,可以将您的简历发给我们,进入我们的研究助理数据库。帮我们写优质的推文可以提升您被知名教授雇用的胜算呀!
在之前的python系列推文中,我们介绍了文件读写系列函数,也介绍了诸多python中的原生数据类型,这是每一个学习python语言的人都应该掌握的知识。而如果你正逐渐将自己的数据处理工作转移到python上来,就会面临一个首要的问题————
如何妥善保存
python中产生的数据,如一个列表,若干个字典。很多人会选择将数据写入一个文本文档,使用时再将之读入。这固然是一种解决办法,但不够“
优雅
”,今天我们将会介绍一种优雅的python读写数据对象的方式:
pickle模块
对象的序列化(serialization)与反序列化(deserialization)
我们曾经提到,python中的所有数据类型(如列表、字典)的实例化
(
一个
列表
a = [1,2,3]
,一个
字典
dicta = {'name':'tom'
}
)
都可看作是一个对象(
object
),对象通常是一种逻辑上的实体,比如一个班级名单列表,以一个list的形式给出,则它是一个对象,一个摩尔斯电码词典,以一个dict的形式给出,则它也是一个对象,当我们想将一个列表中的信息存储下来,以备下次工作时使用时,我们也许会用文件读写函数来完成,如:
classlist = ['tom','karry','bob']
with open("classlist.txt","w+") as f:
for name in classlist:
f.write(name+'\n')
通过使用读写函数,我们将该列表的内容分行写入一个名为
classlist
的列表中。当下次使用时再分行读入。
但python存在着专门读写python对象的方法,那就是
pickle
模块,用于解决对象的序列化与反序列化。所谓
序列化
指的是将python的对象转化为一种专门的
二进制
字符串,并将其以二进制形式写入一个文件中,而
反序列化
则是读取该二进制文件并将其
转化回对象本身
。这样子做有什么好处呢?最显而易见的是它的存储与读写速度会非常的快,后面我们会给出示例说明。其次创立专门的对象数据文件,可以防止数据被不小心修改,产生问题。
pickle模块在标准库内,引入pickle模块很简便。
import pickle
将对象转化为二进制存储文件使用的是pickle模块的
dump
方法,现在我们将一个长度为
100
的列表序列化并保存。
import random
import pickle
a = [random.random() for x in range(100)]
with open("alist.pkl",'wb') as f:
pickle.dump(a,f)
可以看到,与一般的文件读写不同的是,我们的读写方式为
wb
,也就是二进制方式书写,
pickle.dump
方法接收两个必需的参数,
第一个
是要序列化的
对象
,
第二个
是二进制文件
句柄
。执行完毕后,当前工作目录会多出来一个名为
alist.pkl
的文件,需要说明的是,pkl只是一个形式上的后缀名,你可以写成任何其它字符,但为了显示它是一个pickle序列化的数据对象,我们使用
pkl
作为标记。
有读入就会有读取,将pkl文件读取为对象使用的是pickle模块的dump方法,现在我们将刚刚存储的数据文件读取
with open("alist.pkl",'rb') as f:
abak = pickle.load(f)
通过这个样子即可反序列化pkl文件,变成python的列表对象。
在第一节中我们提到,使用pickle来读写对象,其效率更高,我们使用
time
模块验证一下
In [27]: import time
In [28]: a = [random.random() for x in range(100000)]
In [29]: with open("filewrite.txt",'w') as f:
...: starttime = time.time()
...: for num in a:
...: f.write(str(num)+'\n')
...: filetime = time.time() - starttime
...:
In [30]: filetime
Out[30]: 0.32804441452026367
In [31]: with open("pklwrite.pkl",'wb') as f:
...: starttime = time.time()
...: pickle.dump(a,f)
...: pkltime = time.time() - starttime
...:
In [32]: pkltime
Out[32]: 0.10946011543273926
可以看到,对于同样读写一个长度为100000的列表对象,使用文件读写函数所花的时间是使用了pickle模块的
三倍多
,当文件对象越大,差距也会越大。
我们可以查看两个文件的大小,filewrite.txt 的大小为
1980kb
,而pklwrite.pkl仅有
880kb
,在分别打包为rar文件后,大小分别为
863kb
与
780kb,
这说明序列化对象同样减少了数据存储的空间,使用pickle模块存储python数据对象是既省时间又省空间的更优雅的方法。
注:此推文中的图片及封面(除操作部分的)均来源于网络!如有雷同,纯属巧合!
以上就是今天给大家分享的内容了,说得好就赏个铜板呗!有钱的捧个钱场,有人的捧个人场~。
另外,我们开通了苹果手机打赏通道,只要扫描下方的二维码,就可以打赏啦!
应广大粉丝要求,爬虫俱乐部的推文公众号打赏功能可以开发票啦,累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫。第一批发票已经寄到各位小主的手中,大家快来给小爬虫打赏呀~
往期推文推荐:
1.爬虫俱乐部新版块--和我们一起学习Python
2.hello,MySQL--Stata连接MySQL数据库
3.hello,MySQL--odbcload读取MySQL数据
4.再爬俱乐部网站,推文目录大放送!
5.用Stata生成二维码—我的心思你来扫
6.
Mata中的数据导出至Excel
7.
谈谈图形中坐标设置的技巧
8.
如何输出某个关键词在字符串中的所有位置?