第一天上班那天,有位同事把部分工作交接给我,主要是处理过的一些数据,存的是txt格式。然后大概看了下,还挺整齐,用’,’分隔的。读进去才发现,本来应该是个List,然而由于存成了txt,所有的都变成了str。所以转来转去,费了两天时间。突然想起来好像有pickle这么个小玩意,就拿来试试。从此,再也不想用csv啥的存数据了
简单介绍下Pickle
pickle使用二进制协议完成对python对象的序列化和反序列化。“picking”是将python对象转为字节流,而“unpickling”则是从字节流中转出来。
也就是说,无论你要存的内容是字符串、数字、数组、列表、矩阵、DataFrame、np.array()等等,当你进行picking操作时,统统将这些内容转换成字节流保存到文件中,一般是二进制文件。然后当你想使用这些内容时,再从二进制文件中读出来。1
import pickle
–picking–1
2
3data = ...
with open('name.txt','wb') as f:
pickle.dump(data,f,protocol=None)
这样就把数据写进name.txt文件里了,注意这里是二进制,你用记事本打开是乱码。有个参数,protocol,是你选用的协议,默认为3,在python2中默认为0,如果你在python3用dump写进文件,去python2里load读取文件,会报异常。当然这种奇怪的需求很少,如果遇到了,把dump里的protocol=0
就可以了。
当然,你的data可以有多个
如:1
2
3
4a= 1
b =3
with open('name.txt','wb') as f:
pickle.dump([a,b],f)
–unpicking–1
2with open('name.txt','rb') as f:
data = pickle.load(f)
如果你存的数据是多个
那么:1
2
3with open('name.txt','rb') as f:
data= pickle.load(f)
a,b = data
还有除了dump和load,还有dumps和loads。
dumps()和loads()用的不太多,简单说下,和dump类似,dumps把数据写成字节对象,但不用保存到文件。loads则是从字节对象中读出,不用读文件。