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