6.3.1 使用 pickle 模块读写二进制文件

  Python 标准库 pickle 提供的 dump() 方法 用于将数据进行序列化并写入文件(dump() 方法的protocol 参数为True 时可以实现压缩的效果),而load() 用于读取二进制文件内容并进行反序列化,还原为原来的信息。

  1 使用 pickle模块写入二进制文件。

 1 #导入模块
 2 import pickle
 3 
 4 #准备要序列化的数据
 5 n = 7
 6 i = 13000000
 7 a = 99.056
 8 s = '中国人民 123abc'
 9 lst = [[1,2,3],[4,5,6],[7.8,9]]
10 tu = (-5,10,8)
11 coll = {4,5,6}
12 dic = {'a':'apple','b':'banana','g':'grape','o':'orange'}
13 aa = 'c'
14 
15 #以写模式打开二进制文件
16 f = open('sample_pickle.dat','wb')
17 try:
18     pickle.dump(n,f)    #对象个数
19     pickle.dump(i,f)    #写入整数
20     pickle.dump(a,f)    #写入实数
21     pickle.dump(s,f)    #写入实数
22     pickle.dump(lst,f)  #写入列表
23     pickle.dump(tu,f)   #写入元组
24     pickle.dump(coll,f) #写入集合
25     pickle.dump(dic,f)  #写入字典
26 except:
27     print('写文件异常')
28 finally:
29     f.close()
30 
31 #看一下文件内容,已经写入成功。

 

  2 使用 pickle 模块读取上例写入二进制文件的内容

 1 #导入模块
 2 import pickle
 3 
 4 #打开二进制文件
 5 f = open('sample_pickle.dat','rb')
 6 n = pickle.load(f)
 7 print(n)                 #读取文件中数据个个数  7
 8 
 9 for i in range(n):      #文件中有多少个对象就循环多个少次
10     x = pickle.load(f)   #依次读取文件中对象
11     print(x)
12 f.close()
13 
14 '''
15 7
16 13000000
17 99.056
18 中国人民 123abc
19 [[1, 2, 3], [4, 5, 6], [7.8, 9]]
20 (-5, 10, 8)
21 {4, 5, 6}
22 {'a': 'apple', 'b': 'banana', 'g': 'grape', 'o': 'orange'}
23 '''

  

  小提示:pickle 模块还提供了一个 dumps() 方法,可以返回对象序列化之后的字节形式,例如:

 1 >>> import pickle
 2 >>> pickle.dumps([1,2,3])
 3 b'\x80\x03]q\x00(K\x01K\x02K\x03e.'
 4 >>> 
 5 >>> pickle.dumps([1,2,3,4])
 6 b'\x80\x03]q\x00(K\x01K\x02K\x03K\x04e.'
 7 >>> 
 8 >>> pickle.dumps({1,2,3,4})
 9 b'\x80\x03cbuiltins\nset\nq\x00]q\x01(K\x01K\x02K\x03K\x04e\x85q\x02Rq\x03.'
10 >>> 
11 b'\x80\x03K\x01K\x02K\x03\x87q\x00.'
12 >>> 
13 >>> pickle.dumps(123)
14 b'\x80\x03K{.'
15 >>> 

 

  拓展阅读:下面的代码可以用来把文本文件转换为二进制文件,其中,infomation.txt是包含若干文本信息的源文件,infomation_pickle.dat是转换后的二进制文件。

 1 #导入模块
 2 import pickle
 3 
 4 with open('infomation.txt','r',encoding='utf-8') as src,open('infomation_pickle.dat','wb') as dest:
 5     lines = src.readlines()  #把源文件中的所有内容都读取到 lines 列表中
 6     pickle.dump(len(lines),dest)  #先写入对象个数
 7     for line in lines:
 8         pickle.dump(line,dest)
 9 
10 #上面就是已经把数据写入到二进制文件中了,下面从二进制文件中反序列化对象
11 with open('infomation_pickle.dat','rb') as f:
12     n = pickle.load(f)
13     for i in range(n):
14         print(pickle.load(f))
posted @ 2018-04-10 14:37  Avention  阅读(3854)  评论(0编辑  收藏  举报