为找教程的网友们整理了相关的编程文章,网友彭天华根据主题投稿了本篇教程内容,涉及到Python、mat文件、pickle、Python使用pickle模块储存对象操作相关内容,已被883网友关注,如果对知识点想更进一步了解可以在下方电子资料中获取。
Python使用pickle模块储存对象操作
Python读取mat文件,并保存为pickle格式的方法
这两天在搞Theano,要把mat文件转成pickle格式载入Python。
Matlab是把一维数组当做n*1的矩阵的,但Numpy里还是有vector和matrix的区别,Theano也是对二者做了区分。
直接把代码贴出来吧,好像也没什么可讲的 = =
from scipy.io import loadmat import 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'].shape Ytr=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_set, output) output.close() print 'save is done' pkl_file = open('cifar10_small_v.pkl', 'rb') data1 = cPickle.load(pkl_file) # is train_set data2 = cPickle.load(pkl_file) # is valid_set data3 = cPickle.load(pkl_file) # is test_set print type(data1[1]),data1[1].shape pkl_file.close()
Python pickle模块用法实例分析
pickle提供了一个简单的持久化功能。可以将对象以文件的形式存放在磁盘上。
pickle.dump(obj, file[, protocol])
序列化对象,并将结果数据流写入到文件对象中。参数protocol是序列化模式,默认值为0,表示以文本的形式序列化。protocol的值还可以是1或2,表示以二进制的形式序列化。
pickle.load(file)
反序列化对象。将文件中的数据解析为一个Python对象。
其中要注意的是,在load(file)的时候,要让python能够找到类的定义,否则会报错:
比如下面的例子
import pickle class Person: def __init__(self,n,a): self.name=n self.age=a def show(self): print self.name+"_"+str(self.age) aa = Person("JGood", 2) aa.show() f=open('d:\\p.txt','w') pickle.dump(aa,f,0) f.close() #del Person f=open('d:\\p.txt','r') bb=pickle.load(f) f.close() bb.show()
如果不注释掉del Person的话,那么会报错如下:
>>> JGood_2 Traceback (most recent call last): File "C:/py/test.py", line 15, in <module> bb=pickle.load(f) File "C:\Python27\lib\pickle.py", line 1378, in load return Unpickler(file).load() File "C:\Python27\lib\pickle.py", line 858, in load dispatch[key](self) File "C:\Python27\lib\pickle.py", line 1069, in load_inst klass = self.find_class(module, name) File "C:\Python27\lib\pickle.py", line 1126, in find_class klass = getattr(mod, name) AttributeError: 'module' object has no attribute 'Person'
意思就是当前模块找不到类的定义了。
clear_memo()
清空pickler的“备忘”。使用Pickler实例在序列化对象的时候,它会“记住”已经被序列化的对象引用,所以对同一对象多次调用dump(obj),pickler不会“傻傻”的去多次序列化。
看下面的例子:
import StringIO import pickle class Person: def __init__(self,n,a): self.name=n self.age=a def show(self): print self.name+"_"+str(self.age) aa = Person("JGood", 2) aa.show() fle = StringIO.StringIO() pick = pickle.Pickler(fle) pick.dump(aa) val1=fle.getvalue() print len(val1) pick.clear_memo() pick.dump(aa) val2=fle.getvalue() print len(val2) fle.close()
上面的代码运行如下:
>>> JGood_2 66 132 >>>
此时再注释掉pick.clear_memo()后,运行结果如下:
>>> JGood_2 66 70 >>>
主要是因为,python的pickle如果不clear_memo,则不会多次去序列化对象。
Python使用pickle模块储存对象操作示例
众所周知,当我们需要储存数据的时候,就需要用到重定向。但是,这些都是储存简单的数据类型,那么当我们需要存储一个类的实例的时候该怎么存储呢?
实际上,我们需要用到一个模块———pickle,翻译为泡菜坛子
然后贴上一份代码:
# -*- coding:utf-8 -*- import pickle class Person(): def __init__(self, name, age): self.name = name self.age = age def show(self): print(self.name + '_' + str(self.age)) if __name__ == "__main__": a = Person('tian', 20) a.show() c = Person('babydragon' ,5) f = open('test.txt', 'wb')#这里一定要加上b,因为文件默认的write不能是bytes类型的,可以自己尝试着删去看报错 pickle.dump(a, f, 0) pickle.dump(c, f, 0) f.close() f = open('test.txt', 'rb') b = pickle.load(f) mm = pickle.load(f) cc = pickle.load(f)#有点类似于迭代器的感觉,这个就很强了,因为可以储存具体的实例666 f.close() b.show() mm.show() print(b.name)