当前位置:首页 > 编程教程 > Python技术文章 > 用pickle存储Python的原生对象方法

如何使用pickle存储Python的原生对象

  • 发布时间:
  • 作者:码农之家
  • 点击:172

这篇文章主要知识点是关于pickle、Python、原生对象、python pickle存储、读取大数据量列表、字典数据的方法 的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

Python金融大数据分析
  • 类型:Python大小:47.8 MB格式:PDF作者:希尔皮斯科
立即下载

用pickle存储Python的原生对象方法

在Python中存储数据到文件中时,简单的做法是调用open函数执行文件写入操作,但是这样做的话,当我们要重新读取文件内容时,就会出现类型不匹配的情况,因为读取的都是字符串的形式,所以还需要进行类型转换,这样不简洁。

或者使用eval函数把字符串转换为对象,但是有时它过于强大,它会执行Python的任何表达式,甚至做出威胁系统正常工作的表达式,这样做不安全。

如果想存储Python原生对象,但又无法信赖文件的数据来源,那么pickle模块会是个理想的选择。

pickle模块是能够让我们直接在文件中存储几乎任何Python对象的高级工具,并不要求我们把字符串转换来转换去,像是个超级通用的数据格式化和解析工具。

demo.py:

D = {'name':'Allen', 'age':21}
f = open('p_data.pkl','wb')
import pickle
pickle.dump(D,f)
f.close()

f=open('p_data.pkl','rb')
e=pickle.load(f)
print(e)
print(type(e))

控制台输出:

{'name': 'Allen', 'age': 21}
<class 'dict'>
[Finished in 0.4s]

然后它会在指定路径下生成p_data.pkl文件:

8003 7d71 0028 5804 0000 006e 616d 6571
0158 0500 0000 416c 6c65 6e71 0258 0300
0000 6167 6571 034b 1575 2e

如果控制台提示”attributeError:'module' object has no attribute ‘dump'”,那么很可能是因为你的文件名命名为”pickle.py”,这与内置模块文件重名了,改一下就可以了。。

以上这篇用pickle存储Python的原生对象方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持码农之家。

python pickle存储、读取大数据量列表、字典数据的方法

先给大家介绍下python pickle存储、读取大数据量列表、字典的数据

针对于数据量比较大的列表、字典,可以采用将其加工为数据包来调用,减小文件大小

#列表
  #存储
  list1 = [123,'xiaopingguo',54,[90,78]]
  list_file = open('list1.pickle','wb')
  pickle.dump(list1,list_file)
  list_file.close()
 
  #读取
  list_file = open('list1.pickle','rb')
  list2 = pickle.load(list_file)
  print(list2)
 
#字典
  #存储
  list3 = {'12': 123, '23': 'xiaopingguo', '34': 54, '45': [90, 78]}
  list3_file = open('list3.pickle', 'wb')
  pickle.dump(list3, list3_file)
  list3_file.close()
  # # 读取
  list3_file = open('list3.pickle', 'rb')
  list3 = pickle.load(list3_file)
  print(list3)

  print(list3['23']

ps:下面看下python 利用pickle存大数据

最近在处理一份数据,有一个巨大的、字典型的中间变量,由于今后会持久、高频地使用,因此我考虑将其保存成类似于matlab的.mat格式的数据,方便以后随时读取。

理所当然地会想到利用pickle来保存数据,因为这是在python环境下最常用也最简单的存储数据的方式。
python存储数据的方法有很多,最常用的做法就是利用pickle模块,当然还有其他做法,比如存成json、txt等格式。至于

pandas、h5等方式的另说哈~

pickle模块介绍

pickle模块实现了用于序列化和反序列化python对象结构的二进制协议。 序列化操作"pickling"是将python对象层次结构转换为字节流的过程,反序列化操作 "unpickling"则是将字节流转换回对象层次结构。

不得不提到的是,pickle是python所独有的,因此非python程序可能无法重构pickle对象。在工作中,我就遇到一个问题,就是我用sklearn训练得到的机器学习模型,用pickle保存下来后,工程方面的同事是没法用java调用这个模型的,一个临时的方法是有位同事读pickle源码,自己用java一步步反序列化回来,佩服佩服。

pickle使用技巧

对于最简单的代码,使用 dump() 和 load() 函数便足够了。

import pickle
a = 1
# 保存
with open('data.pickle', 'wb') as f:
  pickle.dump(data, f)
# 读取
with open('data.pickle', 'rb') as f:
  b = pickle.load(f)

但如果你读过pickle的说明文档的话,会发现有个参数叫做protocol。参数protocol代表了序列化模式(pickle协议),在python2.X版本默认值为0,在python3.X本默认值为3。简而言之,不同的python版本对应着不同的最高协议,同时protocol值越大,代表了所用的协议版本越高。如图所示,

那么修改protocol会有什么影响呢?protocol值越大,dump的速度越快,并且支持的数据类型更多,保存下来的文件占用空间更小,同时也带来一些其他优化,例如在python3.4中,协议版本4新支持对非常大的数据进行序列化。因此可以的话,请选择最高协议版本作为protocol参数的值,即设protocol=pickle.HIGHEST_PROTOCOL即可。

那么,上面的那段代码可以改成:

import pickle
a = 1
# 保存
with open('data.pickle', 'wb') as f:
  pickle.dump(data, f, protocol=pickle.HIGHEST_PROTOCOL)
# 读取
with open('data.pickle', 'rb') as f:
  b = pickle.load(f)

可能,对于小数据,影响不会很大。

但当你需要对大数据进行序列化的时候,请记得pickle的这个技巧。

总结

以上所述是小编给大家介绍的python pickle存储、读取大数据量列表、字典的数据的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下吧

以上就是本次给大家分享的关于java的全部知识点内容总结,大家还可以在下方相关文章里找到相关文章进一步学习,感谢大家的阅读和支持。

pickle存储Python的原生 相关电子书
学习笔记
网友NO.538160

Python中json模块和pickle模块的简单介绍(附示例)

本篇文章给大家带来的内容是关于Python中json模块和pickle模块的简单介绍(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 Python中的json模块和pickle都是用于数据的序列化和反序列化,它们提供的方法也是一样的:dumps,dump,loads,load dumps(obj): 将对象 序列化 为str。 dump(obj, fp): 将对象 序列化 为str,并存入文件中。 loads(s): 将(序列化后的)字符串 反序列化 为Python对象。 load(fp): 将文件中的(序列化后的)字符串 反序列化 为Python对象。 json和pickle模块虽然都是用于数据的序列化和反序列化,但它们之间还是有许多 区别 的,或者说各有各的 优点和缺点 : 通用性: json序列化后的字符串是通用的格式(普通的字符串)在中不同的平台和语言都可以识别,而pickle序列化后的字符串只有Python可以识别(Python专用序列化模……

网友NO.806500

Python使用pickle模块报错EOFError Ran out of input的解决方法

本文实例讲述了Python使用pickle模块报错EOFError Ran out of input的解决方法。分享给大家供大家参考,具体如下: 遇到了 EOFError:Ran out of input 不到为什么这样,最后用捕获异常的办法解决掉了,暂时对程序本身没有啥影响,代码如下: # coding=utf-8import pickledef usr_date(): try: with open('usr_date.pkl','rb') as f: return pickle.load(f) except EOFError: #捕获异常EOFError 后返回None return Nonedef update_usr(usr_dic): with open('usr_date.pkl','wb') as f: pickle.dump(usr_dic,f)def register(): '注册' usr_dic = {} usr_name = input('请输入用户名') open_date = usr_date() if usr_date() else {} if usr_name in open_date.keys(): print('用户已存在,请登录') return False usr_password = input('请输入你的密码:') usr_dic[usr_name] = usr_password update_usr(usr_dic) return print('注册成功')def Sign_in(): '登录' passdef login_index(): while True: usr = input('1.注册 2.登录 0.退出') if u……

网友NO.902166

如何使用Pickle在Python中保存对象

默认情况下,Pickle是Python库的一部分,只要您需要在用户会话之间保持持久性,它就是一个重要的模块。作为一个模块,pickle提供了在进程之间保存Python对象的功能。 无论您是为数据库、游戏、论坛或其他必须在会话之间保存信息的应用程序编程,pickle都有助于保存标识符和设置。pickle模块可以存储诸如布尔值、字符串和字节数组、列表、字典、函数等数据类型。 注意:pickle的概念也称为序列化、封送和扁平化。然而,关键始终是一样的——将对象保存到文件中以便以后检索。pickle通过将对象写入一个长字节流来实现这一点。 Python中的Pickle示例代码 要将对象写入文件,请使用以下语法中的代码: import pickle object = Object() filehandler = open(filename, 'w') pickle.dump(object, filehandler) 以下是现实示例: import pickle import math object_pi = math.pi file_pi = open('filename_pi.obj',……

网友NO.793160

Python读取mat文件,并保存为pickle格式的方法

这两天在搞Theano,要把mat文件转成pickle格式载入Python。 Matlab是把一维数组当做n*1的矩阵的,但Numpy里还是有vector和matrix的区别,Theano也是对二者做了区分。 直接把代码贴出来吧,好像也没什么可讲的 = = from scipy.io import loadmatimport numpy, cPickle data_dict=loadmat(r'E:\dataset\CIFAR10\CIFAR10_small.mat') #need an r! my_array=numpy.array([1,1])for key in data_dict.keys(): if type(data_dict[key]) == type(my_array): #print matrix information print key, type(data_dict[key]), print data_dict[key].shape #shape(n,1) (matrix in theano) - shape(n,) (vector in theano)print data_dict['Ytr'].shapeYtr=numpy.hstack(data_dict['Ytr'])Yte=numpy.hstack(data_dict['Yte'])Yte=numpy.hstack(data_dict['Yte'])print Ytr.shape train_set=(data_dict['Xtr'],Ytr)valid_set =(data_dict['Xte'],Yte)test_set =(data_dict['Xte'],Yte) output = open('cifar10_small_v.pkl', 'wb') cPickle.dump(train_set, output)cPickle.dump(valid_set, output)cPickle.dump(test……

网友NO.641698

详解Python之数据序列化(json、pickle、shelve)

Ò»¡¢Ç°ÑÔ 1. ÏÖʵÐèÇó ÿÖÖ±à³ÌÓïÑÔ¶¼Óи÷×ÔµÄÊý¾ÝÀàÐÍ£¬ÆäÖÐÃæÏò¶ÔÏóµÄ±à³ÌÓïÑÔ»¹ÔÊÐí¿ª·¢Õß×Ô¶¨ÒåÊý¾ÝÀàÐÍ£¨È磺×Ô¶¨ÒåÀࣩ£¬PythonÒ²ÊÇÒ»Ñù¡£ºÜ¶àʱºòÎÒÃÇ»áÓÐÕâÑùµÄÐèÇó£º °ÑÄÚ´æÖеĸ÷ÖÖÊý¾ÝÀàÐ͵ÄÊý¾Ýͨ¹ýÍøÂç´«Ë͸øÆäËü»úÆ÷»ò¿Í»§¶Ë£» °ÑÄÚ´æÖеĸ÷ÖÖÊý¾ÝÀàÐ͵ÄÊý¾Ý±£´æµ½±¾µØ´ÅÅ̳־û¯£» 2.Êý¾Ý¸ñʽ Èç¹ûÒª½«Ò»¸öϵͳÄÚµÄÊý¾Ýͨ¹ýÍøÂç´«Êä¸øÆäËüϵͳ»ò¿Í»§¶Ë£¬ÎÒÃÇͨ³£¶¼ÐèÒªÏÈ°ÑÕâЩÊý¾Ýת»¯Îª×Ö·û´®»ò×Ö½Ú´®£¬¶øÇÒÐèÒª¹æ¶¨Ò»ÖÖͳһµÄÊý¾Ý¸ñʽ²ÅÄÜÈÃÊý¾Ý½ÓÊÕ¶ËÕýÈ·½âÎö²¢Àí½âÕâЩÊý¾ÝµÄº¬Òå¡£XML ÊÇÔçÆÚ±»¹ã·ºÊ¹ÓõÄÊý¾Ý½»»»¸ñʽ£¬ÔÚÔçÆڵą…

<
1
>

Copyright 2018-2020 www.xz577.com 码农之家

投诉 / 推广 / 赞助:QQ:520161757