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))


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM