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