學習python寫入文件 & 完善異常處理
首先我們將上一節中的文件再次拿來使用。
新建文本文件atext.txt:
JACK: Dont do it!nROSE: Stay back! Dont come any closer!nJACK: Come on! Just give me your hand and Ill pull you back over.nROSE: No, stay where you are! I mean it! Ill let go!nJACK: No, you wont!nROSE: What do you mean, No I wont? Dont presume to tell me what I will and will not do.nROSE: You dont know me.nJACK: Well, you would have done it already.nROSE: Youre distracting me. Go away !nJACK: I cant. Im involved now. You let go, and Im gonna have to jump in there after you.n(Jack starts taking off his shoes. )nROSE: Dont be absurd. Youd be killed.nJACK: Im a good swimmer.nROSE: The fall alone would kill you.
我們的目標如下:n
創建兩個文件,並將JACK和ROSE的對話分別存到兩個文件中。
首先我們來完成原來文件的讀寫:
import osn#新建兩個空列表,分別作為對話的存儲列表。njack_list = []nrose_list = []ntry:n spoken_data = open(atext.txt)n for each_line in spoken_data:n try:n (role,line_spoken) = each_line.split(:,1)n line_spoken = line_spoken.strip() #去除不必要的空格n if role == JACK:n jack_list.append(line_spoken) #將對應回話添加到jack的列表中n elif role ==ROSE:n rose_list.append(line_spoken)n except ValueError:n passn spoken_data.close() #讀取文件完畢,關閉該文件。nexcept IOError:n print("The Spoken_data file is missing!")
下一步將獲得的兩個列表jack_list和rose_list 分別寫入不同的文件中:n
try:n file_jack = open(file_jack.txt,w)n file_rose = open(file_rose.txt,w)n #使用print 寫入到文件當中n print(jack_list,file=file_jack)n print(rose_list,file=file_rose)n #寫入文件之後,我們需要關閉對應的文件n file_jack.close()n file_rose.close()nexcept IOError:n print(File IO error!)#文件讀取錯誤,給以提示。
OK,現在執行一下,分別產生了兩個文件file_jack.txt和file_rose.txt.n
重新查看一下文件,如果在寫入狀態時程序出現了問題,那麼file.close()可能無法執行,文件一直處於開啟狀態,無法關閉。為解決這個問題,可以用finally來擴展try,進一步進行調試。修改如下:
try:n file_jack = open(file_jack.txt,w)n file_rose = open(file_rose.txt,w)n #使用print 寫入到文件當中n print(jack_list,file=file_jack)n print(rose_list,file=file_rose)nnexcept IOError:n print(File IO error!)#文件讀取錯誤,給以提示。nfinally:n #寫入文件之後,我們需要關閉對應的文件n file_jack.close()n file_rose.close()
在Python運行出現錯誤時,並不是我們所寫的只顯示個錯誤信息就行了,其實Python會產生一個特定類型的異常,它會作為一個參數傳入except代碼組。
下面舉個栗子:
#這裡讀取一個不存在的文件,查看Python異常機制會拋出哪些異常信息ntry:n info_data = open (missing.txt)n print(info_data.readline(),end=)nexcept IOError:n print(File error)nfinally:n data.close()
這個missing.txt是不存在的。因此系統會拋出異常:n
File error nTraceback (most recent call last):n File "F:/PythonTea/4_10test.py", line 8, in <module>n data.close()nNameError: name info_data is not defined
因為文件info_data不存在,因此在調用其close()方法時可能會出現錯誤。如何解決呢?
那就在finally後面判斷一下文件是否存在:
try:n info_data = open (missing.txt)n print(info_data.readline(),end=)nexcept IOError:n print(File error)nfinally:n if info_data in locals():n info_data.close()
那麼結果正如預想那樣僅僅出現file error ,我們自定義的錯誤信息。n
locals()函數是在當前程序中所有定義的所有名的集合,顯然info_data沒有被定義成功,因此不符合條件,因此不執行下面的關閉close()操作。
在這裡一直沒有出現我們所需要的出現的系統拋出的異常信息。如何進行調用繼續看如下代碼:
try:n info_data = open (missing.txt)n print(info_data.readline(),end=)nexcept IOError as err:n print(File error + str(err))nfinally:n if info_data in locals():n info_data.close()
str(err)是將錯誤類型定義為print可以列印的字元型,以便print()進行合法列印。n
進一步,Python為簡化該過程,使用with替代finally,使程序變的更簡潔:
#使用with簡化寫法:ntry:n with open (missing.txt,) as info_data :n print("Its...",file=info_data)nexcept IOError as err:n print(File error + str(err))
錯誤信息:n
File error[Errno 2] No such file or directory: missing.txt
重寫一下整個程序如下:
import osn#新建兩個空列表,分別作為對話的存儲列表。njack_list = []nrose_list = []ntry:n with open(text.txt) as spoken_data:n for each_line in spoken_data:n try:n (role,line_spoken) = each_line.split(:,1)n line_spoken = line_spoken.strip() #去除不必要的空格n if role == JACK:n jack_list.append(line_spoken) #將對應回話添加到jack的列表中n elif role ==ROSE:n rose_list.append(line_spoken)n except ValueError:n passn spoken_data.close() #讀取文件完畢,關閉該文件。nexcept IOError as err:n print("The Spoken_data file is missing:" + str(err))nntry:n #使用print 寫入到文件當中n with open(file_jack.txt,w) as file_jack:n print(jack_list, file=file_jack)n with open(file_rose.txt,w) as file_rose:n print(rose_list, file=file_rose)nexcept IOError as err:n print(File IO error! + str(err))#文件讀取錯誤,給以提示。nfinally:n #寫入文件之後,我們需要關閉對應的文件n file_jack.close()n file_rose.close()
或者合併後面的兩個with:n
with open(file_jack.txt,w) as file_jack ,open(file_rose.txt,w) as file_rose:n print(jack_list, file=file_jack)n print(rose_list, file=file_rose)
推薦閱讀: