python 对象序列化 pickling_[Python]对dat文件的操作:序列化对象
一:dat文件
在我之前的博客中,我介紹了對txt文件操作的一些相關知識,以及如何對其進行讀寫操作,也介紹了文本文件和二進制文件的一些區別。雖然對txt文件操作已經能夠滿足儲存數據的需求,但txt文件并不能很好的滿足一些工作需求,所以這里我引入對dat文件的操作。
首先,就純文本類型的數據來說,雖然txt文件已經能夠滿足存儲的需求,但是有時候我們需要將一個如字典和集合這樣復雜的對象存入文件中。我們知道txt文件寫入操作是將字符串寫入文件,如果我們嘗試將對象作為操作數輸入其中那么就會帶來報錯,比如下面的這段代碼及報錯:
>>> infile = open(r'C:\Users\Desktop\test.txt','w')
>>> dic = {'1':'a','2':'b'}
>>> infile.write(dic) #將字典dic寫入文件
Traceback (most recent call last):
File "", line 1, in
infile.write(dic)
TypeError: write() argument must be str, not dict
或許我們可以將對象強制類型轉化為字符串型以后再寫入文件,但是這樣將完全改變對象的性質。所以為了將對象寫入文件,我們在這里介紹序列化對象的相關知識。
二:序列化對象
序列化對象是是將對象轉化為字節流的過程,使之便于保存到文件之后讀取。在python中,序列化對象的過程可以叫做pickling,而python標準庫提供了一個叫做pickle的模塊,在序列化對象時需要先導入此模塊。既然是對文件進行操作,那么和對txt文件操作一樣,我們需要先定義一個文件對象,仍然是用open()函數打開文件,但是打開模式需要注意:
模式
描述
rb
只讀二進制文件,如果文件不存在,則將拋出錯誤
wb
只寫二進制文件,如果文件不存在將創建文件;如果文件已存在將清空之前的內容
ab
附加到二進制文件末尾
(1)如果想寫入文件,可以按照以下步驟進行:
·導入pickle模塊
import pickling
·打開一個二進制文件進行寫入
in_file = open(‘file_name.dat’,‘wb’)
·調用pickle模塊中的dump方法序列化對象,并寫入文件
pickle.dump(object,file) :其中object是欲序列化的變量,file是文件變量
·關閉文件,斷開文件和程序的連接
接下來以一段程序為例:
import pickle
infile = open('test.dat','wb') #以wb模式打開文件
dic = {'1':'a','2':'b','2':'3'}
pickle.dump(dic,infile) #序列化對象并寫入文件
infile.close()
(2)如果想要從文件讀取或解析已經序列化好的對象,可以按照以下步驟進行:
·導入pickle模塊
·打開一個二進制文件進行二進制讀取
out_file = open(‘test.dat’,‘rb’)
·調用pickle模塊中的load方法讀取一個文件并解析他
object = pickle.load(file) :其中file是文件對象變量,object將引用文件讀取并解析出的一個對象
·關閉文件,斷開文件和程序的連接
import pickle
outfile = open('test.dat','rb') #以rb模式打開文件
dic = pickle.load(outfile)
outfile.close()
三:范例
接下來我將以一個簡單的學生信息管理程序為范例講解序列化對象:
import pickle
def main():
choice = int(input('1:存入學生信息數據 2:讀取學生信息數據 3:退出'))
while choice!=3:
if choice==1:
load() #存入數據
choice = int(input('1:存入學生信息數據 2:讀取學生信息數據 3:退出'))
elif choice==2:
read() #讀取數據
choice = int(input('1:存入學生信息數據 2:讀取學生信息數據 3:退出'))
def load():
again = 'y'
infile = open('test.dat', 'ab')
while again == 'y':
student = {} #創建一個空的字典
student['ID'] = input('學號:') #以字符串ID為鍵,以輸入內容為值
student['name'] = input('姓名:')
student['address'] = input('地址:')
pickle.dump(student,infile)
again = input('是否繼續輸入:y/n')
infile.close()
def read():
id = input('請輸入欲查找學生id')
outfile = open('test.dat','rb')
end = False #判斷是否已經達到test.dat文件末尾
while not end:
try:
student = pickle.load(outfile)
if student['ID'] == id:
print('姓名:',student['name'])
print('地址:',student['address'])
print()
except EOFError: #達到文件末尾
end = True
main()
程序的運行結果截圖如下:
總結
以上是生活随笔為你收集整理的python 对象序列化 pickling_[Python]对dat文件的操作:序列化对象的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue 表格内容跳转页面_Vue项目实战
- 下一篇: 人脸扫描建模_人脸识别智能锁安全吗?