《Python程序設(shè)計(jì)》課件第6章 文件與異常處理_第1頁
《Python程序設(shè)計(jì)》課件第6章 文件與異常處理_第2頁
《Python程序設(shè)計(jì)》課件第6章 文件與異常處理_第3頁
《Python程序設(shè)計(jì)》課件第6章 文件與異常處理_第4頁
《Python程序設(shè)計(jì)》課件第6章 文件與異常處理_第5頁
已閱讀5頁,還剩48頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

Python程序設(shè)計(jì)第6章文件與異常處理【教學(xué)目標(biāo)】

學(xué)習(xí)內(nèi)容認(rèn)識(shí)文件文本文件處理CSV格式文件處理路徑和文件操作錯(cuò)誤與異常異常處理技能目標(biāo)能識(shí)別常用文件類型會(huì)使用Python對txt、CSV文件進(jìn)行讀寫操作會(huì)使用os、glob、shutil模塊對文件及路徑進(jìn)行操作能理解異常的概念會(huì)使用try-except-finally異常處理機(jī)制會(huì)使用raise主動(dòng)拋出異常任務(wù)一完善黨員信息管理系統(tǒng)的安全性

為了使系統(tǒng)更加安全,信息不容易泄漏,任何信息管理系統(tǒng)都應(yīng)設(shè)置登陸帳號(hào)和密碼,那么帳號(hào)和密碼怎么設(shè)置及存儲(chǔ)在那里呢?

本次的任務(wù)是使用Python編寫登陸系統(tǒng)驗(yàn)證程序,完善黨員信息管理系統(tǒng)的安全性,要求將用戶的id和密碼以字典對象的格式存入文件中,然后從文件中讀取數(shù)據(jù),并驗(yàn)證輸入的id和密碼是否正確。?!咎崾尽?1)使用列表存入字典內(nèi)容。(2)通過wb模式打開保存文件。(3)因?yàn)閷懭氲膬?nèi)容較復(fù)雜,使用pickl.dump()方法實(shí)現(xiàn)序列化寫入。(4)再通過rb模式打開讀取文件內(nèi)容。(5)輸入id和密碼與文件內(nèi)容比較進(jìn)行驗(yàn)證。(6)輸出驗(yàn)證結(jié)果。(6)如果通過身份驗(yàn)證,則通過導(dǎo)入黨員信息管理系統(tǒng)模塊,進(jìn)入黨員信息管理系統(tǒng)。6.1認(rèn)識(shí)文件

文件是指記錄在存儲(chǔ)介質(zhì)上的一組相關(guān)信息的集合,存儲(chǔ)介質(zhì)可以是紙張、計(jì)算機(jī)磁盤、光盤或其他電子媒體,也可以是照片或標(biāo)準(zhǔn)樣本,還可以是它們的組合。

在本章內(nèi)容中,對于文件若無特殊說明,主要是指計(jì)算機(jī)文件,即以計(jì)算機(jī)磁盤為載體存儲(chǔ)在計(jì)算機(jī)上的信息集合。6.1認(rèn)識(shí)文件6.1.1文件類型6.1認(rèn)識(shí)文件6.1.2文件命名(1)文件名最長可以使用255個(gè)字符。(2)使用擴(kuò)展名,擴(kuò)展名用來表示文件類型,也可以使用多間隔符的擴(kuò)展名,其文件類型由最后一個(gè)擴(kuò)展名決定。如win.ini.txt是一個(gè)合法的文件名。(3)文件名中允許使用空格,但不允許使用英文輸入法狀態(tài)下的<>/\:”*?。(4)Windows系統(tǒng)對文件名中大小寫的字母在顯示時(shí)會(huì)有不同,但在使用時(shí)不區(qū)分大小寫。

需要注意的是,文件擴(kuò)展名可以人為設(shè)定,擴(kuò)展名為txt的文件也有可能是一張圖片;同樣,擴(kuò)展名為mp3的文件,也可能是一個(gè)視頻。但是人為修改文件擴(kuò)展名可能會(huì)導(dǎo)致文件損壞。6.2文本文件處理6.2.1打開與關(guān)閉文件

在Python中進(jìn)行文件的打開和關(guān)閉操作使用兩個(gè)內(nèi)置方法:open()方法和close()方法。

使用open()方法的基本格式如下。

myfile=open(filename[,mode])

其中,myfile為引用文件對象的變量,filename為文件名字符串,mode為文件讀寫模式。文件名可包含相對或絕對路徑,省略路徑時(shí),Python在當(dāng)前工作目錄中搜索文件并打開。實(shí)例一利用open()、close()方法打開、關(guān)閉文件。實(shí)現(xiàn)思路:首先創(chuàng)建D:\python\ch06工作目錄(本章所有例題存放本目錄),并在本目錄內(nèi)創(chuàng)建一個(gè)空白的news.txt文件,然后再創(chuàng)建一個(gè)名為test1.py文件,利用絕對路徑和相對路徑兩種方式打開news.txt文件。myfile=open("news.txt") #打開news.txt文件,參數(shù)為相對路徑,模式缺省為默認(rèn)rprint(myfile)myfile.close()myfile=open(r“D:\python\ch06\news.txt") #參數(shù)為絕對對路徑,模式缺省為默認(rèn)rprint(myfile)myfile.close()6.2文本文件處理6.2.2讀寫文件內(nèi)容

在打開文件之后,需要對文件內(nèi)容進(jìn)行讀取和寫入等操作,文件內(nèi)容相關(guān)的讀寫方法如下:myfile.read():將從文件指針位置開始到文件末尾的內(nèi)容作為一個(gè)字符串返回。myfile.read(n):將從文件指針位置開始到n個(gè)字符作為一個(gè)字符串返回。myfile.readline():將從文件指針位置開始到下一個(gè)換行符號(hào)的內(nèi)容作為一個(gè)字符串返回,讀取內(nèi)容包含換行符號(hào)。myfile.readlines():將從文件指針位置開始到文件末尾的內(nèi)容作為一個(gè)列表返回,每一行的字符串作為一個(gè)列表元素。myfile.write(string):在文件指針位置寫入字符串,返回寫入的字符個(gè)數(shù)。myfile.writelines(list):將列表中的數(shù)據(jù)合為一個(gè)字符串寫入到文件指針位置,返回寫入的字符個(gè)數(shù)。myfile.seek(n):將文件指針移動(dòng)到第n+1個(gè)字節(jié),0表示指向文件開頭的第一個(gè)字節(jié)。myfile.tell():返回文件指針的當(dāng)位置6.2文本文件處理6.2.2讀寫文件內(nèi)容1.文件打開模式實(shí)例二利用write()寫入文件內(nèi)容。如在工作目錄(D:\python\ch06)下編寫一個(gè)名為test2.py程序?qū)崿F(xiàn)在news.txt文件中寫入內(nèi)容“本市明天早上有雨”。實(shí)現(xiàn)思路:接著例6-1內(nèi)容,首先用open方法打開news.txt文件,打開模式設(shè)為w(可寫)模式;使用write()方法將內(nèi)容寫入,再用close()方法關(guān)閉文件。myfile=open("news.txt","w") #通過w模式打開news.txt文件myfile.write("本市明天早上有雨") #寫入內(nèi)容myfile.close() #關(guān)閉文件程序運(yùn)行后,可以手動(dòng)打開news.txt文件,驗(yàn)證內(nèi)容是否已經(jīng)寫入。實(shí)例三利用read()讀出文件內(nèi)容。如在工作目錄(D:\python\ch06)下編寫一個(gè)名為test3.py程序?qū)崿F(xiàn)讀出news.txt文件內(nèi)容。實(shí)現(xiàn)思路:用open()方法打開news.txt文件,打開模式設(shè)為r(只讀)模式;使用read()方法將內(nèi)容讀取并輸出,再用close()方法關(guān)閉文件。myfile=open("news.txt","r") #通過r模式打開news.txt文件print(myfile.read()) #查看內(nèi)容myfile.close() #關(guān)閉文件程序輸出結(jié)果:本市明天早上有雨實(shí)例四追加文件內(nèi)容。如在工作目錄(D:\python\ch06)下編寫一個(gè)名為test4.py程序?qū)崿F(xiàn)在news.txt文件的原內(nèi)容后添加上“作者:葉子”。實(shí)現(xiàn)思路:用open()方法打開news.txt文件,打開模式設(shè)為a(追加)模式;使用write()方法將內(nèi)容追加寫入到最后,再用close()方法關(guān)閉文件。myfile=open("news.txt","a") #通過a模式打開news.txt文件myfile.write(“作者:葉子") #為了美觀插入一個(gè)換行符用"\r"myfile.close() #關(guān)閉文件myfile=open("news.txt","r") #通過r模式打開news.txt文件print(myfile.read()) #查看內(nèi)容myfile.close() #關(guān)閉文件程序輸出結(jié)果:本市明天早上有雨作者:葉子6.2文本文件處理6.2.2讀寫文件內(nèi)容

2.文件讀寫位置使用記事本編輯文件時(shí),都會(huì)有一個(gè)光標(biāo),表示目前需要在哪個(gè)位置進(jìn)行編輯,在Python文件內(nèi)容的讀寫過程中,也提供一種類似的功能seek()方法來定位文件的讀寫位置。seek()方法有兩個(gè)參數(shù),第一個(gè)參數(shù)是偏移量,表示光標(biāo)移動(dòng)幾個(gè)字符,第二個(gè)參數(shù)是定位,0表示從文件開頭開始,1表示從當(dāng)前位置開始,2表示從文件未尾開始,默認(rèn)是0。實(shí)例五在文件指定位置添加內(nèi)容。如在工作目錄(D:\python\ch06)下編寫一個(gè)名為test5.py程序?qū)崿F(xiàn)在news.txt文件的開頭添加“標(biāo)題,天氣情況預(yù)報(bào)”。實(shí)現(xiàn)思路:用seek()方法移動(dòng)光標(biāo)到文件開始位置;如果使用之前學(xué)到的Python知識(shí)還無法直接從文本的開頭添加內(nèi)容,并且保持后面的文本不變。需要先將文件原有的內(nèi)容讀出并保存到某一變量,然后再移動(dòng)光標(biāo)到指定位置,利用r+(可讀寫)模式寫入內(nèi)容覆蓋的特點(diǎn),重新寫入內(nèi)容。myfile=open("news.txt","r+") #r+為既可讀也可寫模式content=myfile.read() #讀出之前的內(nèi)容存到content變量中,并將光標(biāo)移動(dòng)到內(nèi)容的末尾myfile.tell()myfile.seek(0,0) #移動(dòng)光標(biāo)到最前頭myfile.tell()myfile.write("標(biāo)題,天氣情況預(yù)報(bào)"+content) #寫入內(nèi)容myfile.close()myfile=open("news.txt","r+") #r+為既可讀也可寫模式print(myfile.read()) #查看內(nèi)容myfile.close() #關(guān)閉文件程序輸出結(jié)果:標(biāo)題,天氣情況預(yù)報(bào)本市明天早上有雨作者:葉子6.2文本文件處理6.2.2讀寫文件內(nèi)容3.行讀取文件前面介紹的read()方法可以實(shí)現(xiàn)一次性將文件內(nèi)容返回,返回類型為str,另外,還有行讀取的方法,即將每一行當(dāng)成一個(gè)單位字符串,或逐返回或整體返回。行讀取有兩種方法:readline()和readlines()。readline()方法用于在文件中讀取單獨(dú)一整行,從文件指針的位置向后讀取,直到遇到換行符結(jié)束,返回類型為str,當(dāng)遇到比較大的文件的時(shí)候,可以用這種方法來避免內(nèi)存不足問題;readlines()方法讀取文件的所有行,可以用循環(huán)遍歷的方式逐行讀取,返回類型是list。實(shí)例六使用行讀取文件方法讀出文件內(nèi)容。如在工作目錄(D:\python\ch06)下編寫一個(gè)名為test6.py程序,要求使用行讀取的兩種方法分別讀出news.txt文件內(nèi)容。實(shí)現(xiàn)思路:用open()打開news.txt文件,打開模式設(shè)為r(可讀)模式;使用while循環(huán)結(jié)合readline()方法按行讀取,直到?jīng)]有下一行為止;再使用readlines()方法讀取文件內(nèi)容,然后使用for循環(huán)遍歷打印輸入。myfile=open("news.txt","r")line=myfile.readline()whileline:print(line)line=myfile.readline()myfile.close()myfile=open("news.txt","r")forline2inmyfile.readlines():print("readlines方法:"+line2)myfile.close()程序輸出結(jié)果:標(biāo)題,天氣情況預(yù)報(bào)本市明天早上有雨作者:葉子readlines方法:標(biāo)題,天氣情況預(yù)報(bào)readlines方法:本市明天早上有雨readlines方法:作者:葉子6.2文本文件處理6.2.2讀寫文件內(nèi)容4.文件編碼格式文件內(nèi)容由英文、中文等語言符號(hào)組成,在文件讀取過程中,如果和文件編碼格式不符的話,很可能報(bào)錯(cuò)打不開的,在Python中,常見的編碼格式有ASCII、Unicode、GBK、UTF-8等。ASCII碼:ASCⅡ碼使用1個(gè)字節(jié)存儲(chǔ)英文或字符,主要是英文等歐洲國家的語言符號(hào)。Unicode:使用2個(gè)字節(jié)來存儲(chǔ)大約6535個(gè)字符,包括除英文外很多其他國家的語言符號(hào)。GBK:漢字內(nèi)碼擴(kuò)展規(guī)范,將漢字對應(yīng)成一個(gè)數(shù)字編碼。UTF-8:是Unicode的實(shí)現(xiàn)方式之一,對中文友好。常用的支持中文的編碼有UTF-8和GBK,在出現(xiàn)中文字符的編碼格式錯(cuò)誤的時(shí)候,可以嘗試用這兩種方式打開。在打開文件時(shí),使用encoding參數(shù)指定編碼格式。實(shí)例七使用不同的編碼格式打開文件。如在工作目錄(D:\python\ch06)下編寫一個(gè)名為test7.py程,要求使用ASCII編碼格式打開news.txt文件。myfile=open("news.txt","r",encoding="ascii")print(myfile.read())file.close()6.2文本文件處理6.2.3with語句在with語句下對文件操作,可以不用執(zhí)行close()方法關(guān)閉打開的文件。with語句會(huì)自動(dòng)關(guān)閉。因?yàn)閣ith語句有兩個(gè)主要作用。(1)解決異常退出時(shí)的資源釋放問題。(2)解決用戶忘記調(diào)用close()方法而產(chǎn)生的資源泄漏問題。使用with語句的基本格式如下。withopen(…)asmyfile:myfile.read()…其中,myfile是給這個(gè)打開的文件取的名字,不能與其他變量或者關(guān)鍵字沖突。實(shí)例八with語句的使用,如在工作目錄(D:\python\ch06)下編寫一個(gè)名為test8.py程序,要求用with語句打開news.txt文件。withopen("news.txt")asmyfile:print(myfile.read())print(myfile.read())程序輸出結(jié)果:標(biāo)題,天氣情況預(yù)報(bào)本市明天早上有雨作者:葉子ValueError:I/Ooperationonclosedfile.6.2文本文件處理6.2.4用文件存儲(chǔ)對象pickle模塊中最常用的方法有:pickle.dump(obj,file,[,protocol])方法的功能:將obj對象序列化存入已經(jīng)打開的file中。其中,obj是想要序列化的obj對象,file是要存儲(chǔ)的文件名稱,protocol是序列化使用的協(xié)議,如果該項(xiàng)省略,則默認(rèn)為0,表示以文本的形式序列化,還可以是1或2,表示以二進(jìn)制的形式序列化。pickle.load(file)方法的功能:將file中的對象序列化讀出。實(shí)例九pickle模塊讀寫文件,如在工作目錄(D:\python\ch06)下編寫一個(gè)名為test9.py程序,實(shí)現(xiàn)使用pickle模塊寫入列表和字典內(nèi)容到文件中,并把文件內(nèi)容打印輸出。x=[1,2,'abc'] #創(chuàng)建列表對象y={'name':'John','age':20} #創(chuàng)建字典對象withopen(r'D:/python/ch06/objdata.bin','wb')asmyfile: #用wb打開文件importpickle #導(dǎo)入pickle模塊pickle.dump(x,myfile) #將列表寫入文件pickle.dump(y,myfile) #將字典寫入文件withopen(r'D:/python/ch06/objdata.bin','rb')asmyfile: #用rb再次打開文件print(myfile.read()) #用read()方法讀取文件中全部內(nèi)容,并打印myfile.seek(0) #把文件指針移回到開始位置x1=pickle.load(myfile) #從文件中讀取對像x2=pickle.load(myfile) #從文件中讀取對像print(x1) #打印內(nèi)容print(x2) #打印內(nèi)容程序輸出結(jié)果:b'\x80\x04\x95\x0f\x00\x00\x00\x00\x00\x00\x00]\x94(K\x01K\x02\x8c\x03abc\x94e.\x80\x04\x95\x1b\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x04name\x94\x8c\x04John\x94\x8c\x03age\x94K\x14u.'[1,2,'abc']{'name':'John,'age':20}6.3CSV格式文件處理6.3.1CSV格式文件的認(rèn)識(shí)CSV指Comma-SeparatedValues,即逗號(hào)分隔值。CSV文件也是文本文件,內(nèi)容格式與數(shù)據(jù)庫表格格式很像,是用逗號(hào)隔開的結(jié)構(gòu)化數(shù)據(jù),在數(shù)據(jù)分析中,許多原始數(shù)據(jù)就是以這種格式保存的。例如,下面的內(nèi)容是一個(gè)典型的CSV文件內(nèi)容。姓名,年齡,愛好葉子,20,籃球張三,22,足球李四,21,音樂6.3CSV格式文件處理6.3.2操作CSV文件數(shù)據(jù)要在Python中操作或處理CSV格式文件,需要用到Python的內(nèi)置模塊csv。reader()方法返回一個(gè)生成器,可以通過循環(huán)對其整體遍歷。writer()方法返回一個(gè)writer對象,該對象提供writerow()方法,將內(nèi)容按行的方式寫入CSV文件中。實(shí)例十使用csv模塊讀寫文件。如在工作目錄(D:\python\ch06)下編寫一個(gè)名為test10.py程序,使用csv模塊將student.txt文件內(nèi)容寫到CSV格式文件。并把內(nèi)容輸出。為了實(shí)現(xiàn)本例,先在同一工作目錄(D:\python\ch06)下創(chuàng)建一個(gè)名為student.txt的文本文件,內(nèi)容如下:姓名,年齡,成績?nèi)~子,20,85張三,22,70李四,21,90王五,20,80實(shí)現(xiàn)思路:(1)用w模式打開空的student.csv文件,如果沒有則創(chuàng)建,再創(chuàng)建一個(gè)writer對象。(2)打開studenttxt文件,并按行循環(huán)遍歷讀取內(nèi)容。(3)利用writer的writerow()方法把studenttxt文件內(nèi)容按行寫入student.csv文件中。(4)再用r模式打開student.csv文件,再創(chuàng)建一個(gè)reader對象。(5)通過循環(huán)對reader對象整體遍歷輸出。importcsv #導(dǎo)入csv模塊#新建CSV文件,并進(jìn)行寫操作withopen("student.csv","w",encoding="utf-8",newline="")ascsvfile:#以w模式打開csv文件writer=csv.writer(csvfile) #創(chuàng)建一個(gè)編輯對象withopen("student.txt","r")asmyfile: #打開txt文件forlineinmyfile.readlines():line_list=line.strip("\n").split(",") #將內(nèi)容轉(zhuǎn)換為list,去除換行符writer.writerow(line_list) #將內(nèi)容按行寫入#讀操作withopen("student.csv","r",encoding="utf-8")ascsvfile:#打開csv文件,r模式reader=csv.reader(csvfile) #創(chuàng)建一個(gè)編輯對象forrowinreader:print(row) #將內(nèi)容讀出程序輸出結(jié)果:['姓名年齡成績']['葉子2085']['張三2270']['李四2190']['王五2080']6.4路徑和文件操作一個(gè)文件有兩個(gè)屬性,一是文件名,一是路徑。路徑指明了文件在計(jì)算機(jī)上的位置,它由目錄及目錄分隔符組成。例如,在Windows系統(tǒng)下“D:\python\ch06\test1.py”路徑指明了文件test1.py的位置,它位于D盤python目錄下的ch06目錄下,路徑D:部分是根目錄,python和ch06均為目錄,Windows系統(tǒng)下目錄分隔符為\,目錄下可以包含文件和其他目錄。另外,文件的擴(kuò)展名為.py,說明它是一個(gè)py源程序文件。

在Python中,能對路徑和文件操作的模塊較多,本節(jié)主要介紹常用的三個(gè)模塊:os、glob、shutil。6.4路徑和文件操作6.4.1os模塊os模塊是Python標(biāo)準(zhǔn)庫中的一個(gè)用于訪問操作系統(tǒng)的模塊,比如復(fù)制、創(chuàng)建、修改、刪除文件及文件夾,設(shè)置用戶權(quán)限等功能。實(shí)例十一使用os模塊創(chuàng)建目錄并在目錄下創(chuàng)建文件。如在工作目錄(D:\python\ch06)下編寫一個(gè)名為test11.py程序,要求使用os模塊創(chuàng)建目錄"D:\python\ch06\學(xué)生數(shù)據(jù)"。并在本目錄下創(chuàng)建一個(gè)文件myfile.txt,里面的內(nèi)容為:“HelloPython”。實(shí)現(xiàn)思路:首先確認(rèn)是否有目標(biāo)路徑,如果沒有則創(chuàng)建。importos #導(dǎo)入os模塊path="D:\python\ch06\學(xué)生數(shù)據(jù)" #確定路徑ifnotos.path.exists(path): #判斷路徑是否存在os.mkdir(path) #創(chuàng)建路徑os.chdir(path) #改變當(dāng)前工作目錄到D:\python\ch06\學(xué)生數(shù)據(jù)myfile=open("myfile.txt","w") #打開文件myfile.write("HelloPython") #向文件寫入內(nèi)容myfile.close() #關(guān)閉文件代碼運(yùn)行成功之后,通過Windows文檔管理器查看,可以發(fā)現(xiàn)路徑“D:\python\ch06\學(xué)生數(shù)據(jù)”已經(jīng)被創(chuàng)建,并且有一個(gè)文件myfile.txt,里面的內(nèi)容為:“HelloPython”。6.4路徑和文件操作6.4.2glob模塊glob模塊提供了一個(gè)很好用的方法來查找某個(gè)類型的文件,它接受一個(gè)路徑作為參數(shù),返回所有匹配到的文件類型是list,并且glob方法提供模糊匹配的方式,可以查找到自己想要類型的文件。例如,查找路徑“D:\”下的所有.txt文件,只需要寫下語句glob.glob(D:\*txt),就會(huì)找到路徑“D:\”下的所有txt類型文件,并以列表的形式返回,這里的“*”是一個(gè)通配符,可以匹配0個(gè)或者多個(gè)字符。通過這種方式可以匹配到所有后綴名為.txt的文件,另外,glob.glob()方法返回的是list。實(shí)例十二使用glob模塊查找文件路徑。如在工作目錄(D:\python\ch06)下編寫一個(gè)名為test12.py程序,使用glob模塊查找當(dāng)前工作目錄下的txt文件。importglob #導(dǎo)入glob模塊path="D:\*\ch06\"

#第一級(jí)目錄忘記了,用*模糊匹配foriinglob.glob(path+"*"): #輸出該目錄下所有的文件,用*模糊匹配print(i)print(glob.glob(path+"*.txt")) #輸出目錄下后綴名為.txt的文件6.4路徑和文件操作6.4.3shutil模塊shutil模塊是對os模塊中文件操作的進(jìn)一步補(bǔ)充,是Python自帶的關(guān)于文件、文件夾、壓縮文件的高層次的操作工具。shutil模塊中提供了文件復(fù)制的方法copy()和文件移動(dòng)剪切的方法move(),它們都帶有兩個(gè)參數(shù),第一個(gè)參數(shù)是原文件路徑,第二個(gè)參數(shù)是目的文件路徑。實(shí)例十三使用shutil模塊對文件進(jìn)行移動(dòng)和復(fù)制。如在工作目錄(D:\python\ch06)下編寫一個(gè)名為test13.py程序,使用shutil模塊對student.txt文件移動(dòng)和news.txt文件復(fù)制到指定文件夾中。實(shí)現(xiàn)思路:首先用os.mkdir方法在同一工作目錄(D:\python\ch06)下創(chuàng)建“move文件夾”和“copy文件夾”。接著用shutil.copy()方法將news.txt文件復(fù)制粘貼到“copy文件夾”路徑下,再用shutil.move()方法將student.txt文件剪切粘貼到“move文件夾”路徑下,最后,使用glob.glob()方法顯示目錄文件。importshutil #導(dǎo)入shutil模塊importos #導(dǎo)入os模塊importglob #導(dǎo)入glob模塊path="D:\python\ch06\"

#確定路徑os.mkdir(path+"move文件夾\") #創(chuàng)建move文件夾os.mkdir(path+"copy文件夾\") #創(chuàng)建copy文件夾shutil.move(path+"student.txt",path+"move文件夾/student.txt") #剪切粘貼student.txtshutil.copy(path+"news.txt",path+"copy文件夾/news.txt") #復(fù)制粘貼news.txtforfileinglob.glob(path+"*\*"):

#顯示目錄文件print(file)【任務(wù)實(shí)現(xiàn)】任務(wù)二優(yōu)化黨員信息管理系統(tǒng)

經(jīng)過前面章節(jié)編寫了黨員信息管理系統(tǒng),并增加了登陸系統(tǒng)驗(yàn)證功能,系統(tǒng)的安全性有了,但系統(tǒng)運(yùn)行使用時(shí)的穩(wěn)定性也是我們開發(fā)者不能忽略的。

本次的任務(wù)是優(yōu)化黨員信息管理系統(tǒng),讓程序更加健壯,利用異常處理機(jī)制預(yù)防程序運(yùn)行過程中出現(xiàn)的各種未知異常,避免程序崩潰,提供給用戶友好的使用體驗(yàn)?!咎崾尽?/p>

因不能確定程序運(yùn)行中可能會(huì)出現(xiàn)的異常,所以使用異常類的基類BaseException對異常處理。6.5錯(cuò)誤與異常6.5.1語法錯(cuò)誤

語法錯(cuò)誤,也稱作解析錯(cuò)誤,是學(xué)習(xí)Python過程中最常見的。下面的代碼中print()函數(shù)有拼寫錯(cuò)誤。>>>printf(hello,world)Traceback(mostrecentcalllast): File"<pyshell#0>",line1,in<module> printf(hello,world)NameError:name'printf'isnotdefined6.5錯(cuò)誤與異常6.5.2異常

異常是在程序運(yùn)行過程中發(fā)生的非正常事件,這類事件可能是程序本身的設(shè)計(jì)錯(cuò)誤,也可能是外界環(huán)境發(fā)生了變化導(dǎo)致,如網(wǎng)絡(luò)連接不通、算術(shù)運(yùn)算出錯(cuò)、遍歷列表超出范圍、導(dǎo)入的模塊不存在等,異常會(huì)中斷正在運(yùn)行的程序。實(shí)例十四編寫一個(gè)計(jì)算學(xué)生平均成績功能的函數(shù)程序。deffunave(s=[],n=[]):ave=sum(s)/(len(n)-1)print("平均分是:",ave)score=[]member=1while(member!=0):member=int(input('請輸入學(xué)生成績(0為結(jié)束):'))score.append(member)name=[]member=""while(member!="#"):member=input('請輸入學(xué)生姓名(#為結(jié)束):')name.append(member)funave(score,name)6.5錯(cuò)誤與異常6.5.3常見異常6.6異常處理

異常處理就像人們平時(shí)對可能遇到的意外情況,預(yù)先想好了一些處理方法,若發(fā)生了異常,程序會(huì)按照預(yù)定的處理方法對異常進(jìn)行處理,異常處理完畢后,程序繼續(xù)運(yùn)行。6.6異常處理6.6.1使用try-except處理異常實(shí)例十五編寫一個(gè)使用try-except處理異常的程序,改進(jìn)例6-14程序,對輸入數(shù)據(jù)時(shí)粗心的工作做一下預(yù)防,也對可能發(fā)生異常的地方做一下補(bǔ)救,讓程序不會(huì)因產(chǎn)生異常導(dǎo)致崩潰。deffunave(s=[],n=[]):try:ave=sum(s)/(len(n)-1)print("平均分是:",ave)exceptZeroDivisionError:print("出現(xiàn)了被0除的情況,可能沒輸入學(xué)生姓名,請重新試試")else:print("運(yùn)行成功")score=[]member=1while(member!=0):member=int(input('請輸入學(xué)生成績(0為結(jié)束):'))score.append(member)name=[]member=""while(member!="#"):member=input('請輸入學(xué)生姓名(#為結(jié)束):')name.append(member)funave(score,name)運(yùn)行程序沒有出錯(cuò),根據(jù)提示輸入如下內(nèi)容時(shí):請輸入學(xué)生成績(0為結(jié)束):70請輸入學(xué)生成績(0為結(jié)束):80請輸入學(xué)生成績(0為結(jié)束):0請輸入學(xué)生姓名(#為結(jié)束):#程序輸出結(jié)果:出現(xiàn)了被0除的情況,可能沒輸入學(xué)生姓名,請重新試試實(shí)例十六在例6-15程序的funave()函數(shù)中添加功能,要求在輸出的結(jié)果中可以顯示每一位同學(xué)高于或者低于平均分多少分。deffunave(s=[],n=[]):try:ave=sum(s)/(len(n)-1)print("平均分是:",ave)foriinrange(len(s)):print("%s比平均分相差:%d"%(n[i],s[i]-ave))exceptZeroDivisionError:print("出現(xiàn)了被0除的情況,可能沒輸入學(xué)生姓名,請重新試試")else:print("運(yùn)行成功")score=[]member=1while(member!=0):member=int(input('請輸入學(xué)生成績(0為結(jié)束):'))score.append(member)name=[]member=""while(member!="#"):member=input('請輸入學(xué)生姓名(#為結(jié)束):')name.append(member)funave(score,name)運(yùn)行程序沒有出錯(cuò),根據(jù)提示輸入如下內(nèi)容時(shí):請輸入學(xué)生成績(0為結(jié)束):80請輸入學(xué)生成績(0為結(jié)束):70請輸入學(xué)生成績(0為結(jié)束):0請輸入學(xué)生姓名(#為結(jié)束):葉子請輸入學(xué)生姓名(#為結(jié)束):#程序輸出結(jié)果:IndexError:listindexoutofrange實(shí)例十七改良例6-16程序,上例中只對除數(shù)是0的異常進(jìn)行處理,沒有對索引出界的異常進(jìn)行處理,由于無法確定到底還會(huì)有哪種類型的異常出現(xiàn),在本例中使用BaseException(常規(guī)錯(cuò)誤的基類)來對除了ZeroDivisionError之外的所有異常做統(tǒng)一處理。deffunave(s=[],n=[]):try:ave=sum(s)/(len(n)-1)print("平均分是:",ave)foriinrange(len(s)):print("%s比平均分相差:%d"%(n[i],s[i]-ave))exceptZeroDivisionError:print("出現(xiàn)了被0除的情況,可能沒輸入學(xué)生姓名,請重新試試")exceptBaseExceptionase: #e是的一個(gè)實(shí)例對象print("出現(xiàn)了%s異常,請仔細(xì)檢查"%e)else:print("運(yùn)行成功")score=[]member=1while(member!=0):member=int(input('請輸入學(xué)生成績(0為結(jié)束):'))score.append(member)name=[]member=""while(member!="#"):member=input('請輸入學(xué)生姓名(#為結(jié)束):')name.append(member)funave(score,name)運(yùn)行程序沒有出錯(cuò),根據(jù)提示輸入如下內(nèi)容時(shí):請輸入學(xué)生成績(0為結(jié)束):80請輸入學(xué)生成績(0為結(jié)束):70請輸入學(xué)生成績(0為結(jié)束):0請輸入學(xué)生姓名(#為結(jié)束):葉子請輸入學(xué)生姓名(#為結(jié)束):#程序輸出結(jié)果:平均分是:150.0葉子比平均分相差:-70#比平均分相差:-80出現(xiàn)了listindexoutofrange異常,請仔細(xì)檢查6.6異常處理6.6.2使用try-except-finally處理異常實(shí)例十八在例6-17程序的funave()函數(shù)中添加功能,要求無論輸入什么內(nèi)容,都能輸出時(shí)間。importdatetimedeffunave(s=[],n=[]):try:ave=sum(s)/(len(n)-1)print("平均分是:",ave)foriinrange(len(s)):print("%s比平均分相差:%d"%(n[i],s[i]-ave))exceptZeroDivisionError:print("出現(xiàn)了被0除的情況,可能沒輸入學(xué)生姓名,請重新試試")exceptBaseExceptionase: #e是的一個(gè)實(shí)例對象print("出現(xiàn)了%s異常,請仔細(xì)檢查"%e)else:print("運(yùn)行成功")

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論