python pickle模块学习理解(一)

pickle提供了一个简单的持久化功能。可以将对象以文件的形式存放在磁盘上。pickle模块只能在python中使用,python中几乎所有的数据类型(列表,字典,集合,类等)都可以用pickle来序列化,在学习过程中参考很多前辈的代码,在此总结一下,并提供可用的函数供大家参考。环境:win7 32 位,python3.6
一. 基本使用方法
pickle.dump(obj, file, [,protocol])  注解:将对象obj保存到文件file中去。protocol为序列化使用的协议版本,0:ASCII协议,所序列化的对象使用可打印的ASCII码表示;1:老式的二进制协议;2:2.3版本引入的新二进制协议,较以前的更高效。其中协议0和1兼容老版本的python。protocol默认值为0。file:对象保存到的类文件对象。file必须有write()接口, file可以是一个以’w’方式打开的文件或者一个StringIO对象或者其他任何实现write()接口的对象。如果protocol>=1,文件对象需要是二进制模式打开的。
先测试一下,当前路径建立文件 pickT.txt pickt.ini pickT.bin应该够了,这里引用代码参考http://www.cnblogs.com/pzxbc/archive/2012/03/18/2404715.html表示感谢

# coding: utf8
import  pickle
if __name__ == "__main__":
    data1 = {'a': [1, 2.0, 3, 4 + 6j],
             'b': ('string', u'Unicode string'),
             'c': None}
    filename="pickT.txt" #pickT.txt pickt.ini pickT.bin  测试都可以以
    with open(filename,'wb') as fw:
        pickle.dump(data1, fw,-1) 
    with open(filename, 'rb') as fw:
        s=pickle.load(fw)
    print("s的类型",type(s))
    print("s的值",s)

运行结果如下:
s的类型 <class ‘dict’> 这里发现序列化的最大优势,取到的数据不需要做数据转换了(如果用TXT文件直接读取)
s的值 {‘a’: [1, 2.0, 3, (4+6j)], ‘b’: (‘string’, ‘Unicode string’), ‘c’: None}
pickle.dump(data1, fw,-1)
如前文protocol为序列化使用的协议版本
pickT.txt格式如下(-1二进制格式,乱码)这样保护了你的数据:
�昹 }�(�a擼�(KG@ K�builtins攲complex敁擥@ G@ 啍R攅�b攲string攲Unicode string攩攲c擭u.
如果需要观察这些变量 修改为pickle.dump(data1, fw,0)
运行后pickT.txt格式如下
(dp0
Va
p1
(lp2
L1L
aF2.0
aL3L
ac__builtin__
complex
p3
(F4.0
F6.0
tp4
Rp5
asVb
p6
(Vstring
p7
VUnicode string
p8
tp9
sVc
p10
Ns.
二 存储多个值测试
我有10个变量存储到十个文件是很蠢的事情,这么做还不如直接读取文件。直接看代码

# coding: utf8
import  pickle
if __name__ == "__main__":
    data1 = {'a': [1, 2.0, 3, 4 + 6j],
             'b': ('string', u'Unicode string'),
             'c': None}
    filename="pickT.txt" #pickT.txt pickt.ini pickT.bin  测试都可以以
    selfref_list = [1, 2, 3]
    with open(filename,'wb') as fw:
        pickle.dump(data1, fw,-1)
        pickle.dump(selfref_list, fw, -1)
    with open(filename, 'rb') as fw:
        s=pickle.load(fw)  #取第一个变量
        print("s的类型",type(s))
        print("s的值",s)
        s1=pickle.load(fw)   #取第二个变量
        print("s1的类型", type(s1))
        print("s2的值", s1)  

输出:
s的类型 <class ‘dict’>
s的值 {‘a’: [1, 2.0, 3, (4+6j)], ‘b’: (‘string’, ‘Unicode string’), ‘c’: None}
s1的类型 <class ‘list’>
s2的值 [1, 2, 3]
这里添加了两个变量data1(dict),selfref_list(list)
pickle.dump(data1, fw,-1)
pickle.dump(selfref_list, fw, -1)
s=pickle.load(fw) #取第一个变量 ,s1=pickle.load(fw) #取第二个变量调用一侧pickle.load获得一个变量
这样基本清楚了,下面给出一个可以使用的函数,自己写的,请大家指正。

# coding: utf8
import  pickle
def storeTree(filename,*args):
    with open(filename,'wb') as fw:  #打开需要用'wb'
        for i in args:
            pickle.dump(i, fw,-1) #为了保护数据protocol=-1,设为0可以看到数据

def grabTree(filename):
    Mylist=[]   #返回变量的列表
    with open(filename,'rb') as fr:
        while True:        #这里用try最简单,不用定义循环次数
            try:
                Mylist.append(pickle.load(fr))
            except:
                break
    return Mylist

if __name__ == "__main__":
    data1 = {'a': [1, 2.0, 3, 4 + 6j],
             'b': ('string', u'Unicode string'),
             'c': None}
    selfref_list = [1, 2, 3]
    filename="pickT.bin"
    storeTree(filename,data1,selfref_list)
    s=grabTree(filename)
    print("返回数据类型",type(s))
    print("返回数据内容",s)
    for Num ,i in enumerate(s):
        print("{}{}{}{}".format("第",Num+1,"个变量类型=",type(i)))
        print("{}{}{}{}".format("第",Num+1,"个变量值=",i))

输出:
返回数据类型 <class ‘list’>
返回数据内容 [{‘a’: [1, 2.0, 3, (4+6j)], ‘b’: (‘string’, ‘Unicode string’), ‘c’: None}, [1, 2, 3]]
第1个变量类型=<class ‘dict’>
第1个变量值={‘a’: [1, 2.0, 3, (4+6j)], ‘b’: (‘string’, ‘Unicode string’), ‘c’: None}
第2个变量类型=<class ‘list’>
第2个变量值=[1, 2, 3]
下一篇 python pickle模块学习理解(二)

猜你喜欢

转载自blog.csdn.net/weixin_39462002/article/details/84100599