一,什么是Pickle文件
提到Pickle文件想必很多人一开始都跟我一样的反应。这是个什么鬼???
这个文件类型只有在Python中存在。pickle提供了一个简单的持久化功能。可以将对象以文件的形式存放在磁盘上。
pickle模块只能在python中使用,python中几乎所有的数据类型(列表,字典,集合,类等)都可以用pickle来序列化,
pickle序列化后的数据,可读性差,人一般无法识别。说白了Pickle文件就是把数据转成二进制进行存储,是给机器看的不是给人看的。
二,为什么用Pickle文件
上述我们已经说过了pickle序列化后的数据是二进制,那也就是说把文件作为二进制存储后,对于文件的读取会非常的快。如果有一个每个sheets为上万行的Excel,当我们直接读取这个excel文件后果你懂得。。有的小伙伴可能会说转成csv后进行读取,是的转csv后确实会比之前的xlsx格式的读取来的快些。但是读取之前计算机依然需要编译后再读取。文件一大还是很慢。那么这时候Pickle的优点就显现出来了。
三,如何转换Pickle文件
注释:以下代码是通过jupyther来进行运行的。如果您使用的是.py的文件。那么if __name__ == "__main__": 这个入口函数请只写一个
另外写了一个use_time的装饰器,为了测试每个函数运行后所话费的时间。
#%% import pandas as pd from time import time def use_time(func): """ :param func: 设置时间装饰器 :return: 返回func函数及wrapper对象 """ def wrapper(*args,**kwargs): start = time() result = func(*args,**kwargs) use = round(time() - start,3) #保留3位 print("%s()用时: %s秒" %(func.__name__,use)) return result return wrapper @use_time def read_excel(fn): df =pd.read_excel(fn) return df @use_time def write_to_pickle(df,path): df.to_pickle(path) @use_time def read_pickle_file(fn): df = pd.read_pickle(fn) return df if __name__ == '__main__': file_path = R"C:UsersAdministratorPycharmProjectspython_BasicPandas_to_Excel20200721source_file按照班级分离文件.xlsx" #直接读取excel文件 file01 = read_excel(file_path) print(file01) write_to_pickle(file01,R"C:UsersAdministratorPycharmProjectspython_BasicPandas_to_Excel20200727output_pickle.pkl") #%% if __name__ == '__main__': file02 = read_pickle_file(R"C:UsersAdministratorPycharmProjectspython_BasicPandas_to_Excel20200727output_pickle.pkl") print(file02)
执行read_excel函数的用时:
执行write_to_pickle函数的用时:
执行read_pickle_file函数的用时:
上述脚本运用过后的时间可以看出,转pickle文件后再读取所话费的时间是没有转之前读取的好几倍。我的数据量只有226行所以看不太出效果。如果数据量很大的情况下效果就很显著了。所以当我们读取Excel,csv等数据量比较的的表格文件时,建议转pickle文件后再读取。