日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python 对象序列化 pickling_[Python]对dat文件的操作:序列化对象

發(fā)布時(shí)間:2025/3/21 python 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 对象序列化 pickling_[Python]对dat文件的操作:序列化对象 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一: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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。