目錄
10.3.4 else 代碼塊、
10.3.5 處理 FileNotFoundError 異常
alice.py
在這個(gè)示例中,try代碼塊引發(fā)FileNotFoundError異常,因此Python找出與該錯(cuò)誤匹配的 except代碼塊,并運(yùn)行其中的代碼。最終的結(jié)果是顯示一條友好的錯(cuò)誤消息,而不是traceback:
10.3.6 分析文本
10.3.7 使用多個(gè)文件
word_count.py
10.3.8 失敗時(shí)一聲不吭
關(guān)于“Python”的核心知識(shí)點(diǎn)整理大全24-CSDN博客
往期快速傳送門??(在文章最后):
感謝大家的支持!歡迎訂閱收藏!專欄將持續(xù)更新!
10.3.4 else 代碼塊、
通過(guò)將可能引發(fā)錯(cuò)誤的代碼放在try-except代碼塊中,可提高這個(gè)程序抵御錯(cuò)誤的能力。錯(cuò) 誤是執(zhí)行除法運(yùn)算的代碼行導(dǎo)致的,因此我們需要將它放到try-except代碼塊中。這個(gè)示例還包 含一個(gè)else代碼塊;依賴于try代碼塊成功執(zhí)行的代碼都應(yīng)放到else代碼塊中:
print("Give me two numbers, and I'll divide them.")
print("Enter 'q' to quit.")
while True:
first_number = input("\nFirst number: ")
if first_number == 'q':
break
second_number = input("Second number: ")
1 try:
answer = int(first_number) / int(second_number)
2 except ZeroDivisionError:
print("You can't divide by 0!")
3 else:
print(answer)
我們讓Python嘗試執(zhí)行try代碼塊中的除法運(yùn)算(見(jiàn)1),這個(gè)代碼塊只包含可能導(dǎo)致錯(cuò)誤的 代碼。依賴于try代碼塊成功執(zhí)行的代碼都放在else代碼塊中;在這個(gè)示例中,如果除法運(yùn)算成 功,我們就使用else代碼塊來(lái)打印結(jié)果(見(jiàn)2)。 except代碼塊告訴Python,出現(xiàn)ZeroDivisionError異常時(shí)該怎么辦(見(jiàn)3)。如果try代碼塊因除零錯(cuò)誤而失敗,我們就打印一條友好的消息,告訴用戶如何避免這種錯(cuò)誤。程序?qū)⒗^續(xù)運(yùn)行, 用戶根本看不到traceback:
Give me two numbers, and I'll divide them.
Enter 'q' to quit.
First number: 5
Second number: 0
You can't divide by 0!
First number: 5
Second number: 2
2.5
First number: q
try-except-else代碼塊的工作原理大致如下:Python嘗試執(zhí)行try代碼塊中的代碼;只有可 能引發(fā)異常的代碼才需要放在try語(yǔ)句中。有時(shí)候,有一些僅在try代碼塊成功執(zhí)行時(shí)才需要運(yùn)行 的代碼;這些代碼應(yīng)放在else代碼塊中。except代碼塊告訴Python,如果它嘗試運(yùn)行try代碼塊中 的代碼時(shí)引發(fā)了指定的異常,該怎么辦。 通過(guò)預(yù)測(cè)可能發(fā)生錯(cuò)誤的代碼,可編寫健壯的程序,它們即便面臨無(wú)效數(shù)據(jù)或缺少資源,也 能繼續(xù)運(yùn)行,從而能夠抵御無(wú)意的用戶錯(cuò)誤和惡意的攻擊。
10.3.5 處理 FileNotFoundError 異常
使用文件時(shí),一種常見(jiàn)的問(wèn)題是找不到文件:你要查找的文件可能在其他地方、文件名可能 不正確或者這個(gè)文件根本就不存在。對(duì)于所有這些情形,都可使用try-except代碼塊以直觀的方 式進(jìn)行處理。
我們來(lái)嘗試讀取一個(gè)不存在的文件。下面的程序嘗試讀取文件alice.txt的內(nèi)容,但我沒(méi)有將 這個(gè)文件存儲(chǔ)在alice.py所在的目錄中:
alice.py
filename = 'alice.txt'
with open(filename) as f_obj:
contents = f_obj.read()
Python無(wú)法讀取不存在的文件,因此它引發(fā)一個(gè)異常:
Traceback (most recent call last):
File "alice.py", line 3, in <module>
with open(filename) as f_obj:
FileNotFoundError: [Errno 2] No such file or directory: 'alice.txt'
在上述traceback中,最后一行報(bào)告了FileNotFoundError異常,這是Python找不到要打開(kāi)的文件時(shí)創(chuàng)建的異常。在這個(gè)示例中,這個(gè)錯(cuò)誤是函數(shù)open()導(dǎo)致的,因此要處理這個(gè)錯(cuò)誤,必須將 try語(yǔ)句放在包含open()的代碼行之前:
filename = 'alice.txt'
try:
with open(filename) as f_obj:
contents = f_obj.read()
except FileNotFoundError:
msg = "Sorry, the file " + filename + " does not exist."
print(msg)
在這個(gè)示例中,try代碼塊引發(fā)FileNotFoundError異常,因此Python找出與該錯(cuò)誤匹配的 except代碼塊,并運(yùn)行其中的代碼。最終的結(jié)果是顯示一條友好的錯(cuò)誤消息,而不是traceback:
Sorry, the file alice.txt does not exist.
如果文件不存在,這個(gè)程序什么都不做,因此錯(cuò)誤處理代碼的意義不大。下面來(lái)擴(kuò)展這個(gè)示 例,看看在你使用多個(gè)文件時(shí),異常處理可提供什么樣的幫助。
10.3.6 分析文本
你可以分析包含整本書的文本文件。很多經(jīng)典文學(xué)作品都是以簡(jiǎn)單文本文件的方式提供的, 因?yàn)樗鼈儾皇馨鏅?quán)限制。本節(jié)使用的文本來(lái)自項(xiàng)目Gutenberg(http://gutenberg.org/),這個(gè)項(xiàng)目提 供了一系列不受版權(quán)限制的文學(xué)作品,如果你要在編程項(xiàng)目中使用文學(xué)文本,這是一個(gè)很不錯(cuò)的 資源。
下面來(lái)提取童話Alice in Wonderland的文本,并嘗試計(jì)算它包含多少個(gè)單詞。我們將使用方 法split(),它根據(jù)一個(gè)字符串創(chuàng)建一個(gè)單詞列表。下面是對(duì)只包含童話名"Alice in Wonderland" 的字符串調(diào)用方法split()的結(jié)果:
>>> title = "Alice in Wonderland"
>>> title.split()
['Alice', 'in', 'Wonderland']
方法split()以空格為分隔符將字符串分拆成多個(gè)部分,并將這些部分都存儲(chǔ)到一個(gè)列表中。 結(jié)果是一個(gè)包含字符串中所有單詞的列表,雖然有些單詞可能包含標(biāo)點(diǎn)。為計(jì)算Alice in Wonderland包含多少個(gè)單詞,我們將對(duì)整篇小說(shuō)調(diào)用split(),再計(jì)算得到的列表包含多少個(gè)元 素,從而確定整篇童話大致包含多少個(gè)單詞:
filename = 'alice.txt'
try:
with open(filename) as f_obj:
contents = f_obj.read()
except FileNotFoundError:
msg = "Sorry, the file " + filename + " does not exist."
print(msg)
else:
# 計(jì)算文件大致包含多少個(gè)單詞
1 words = contents.split()
2 num_words = len(words)
3 print("The file " + filename + " has about " + str(num_words) + " words.")
我們把文件alice.txt移到了正確的目錄中,讓try代碼塊能夠成功地執(zhí)行。在?處,我們對(duì)變 量contents(它現(xiàn)在是一個(gè)長(zhǎng)長(zhǎng)的字符串,包含童話Alice in Wonderland的全部文本)調(diào)用方法 split(),以生成一個(gè)列表,其中包含這部童話中的所有單詞。當(dāng)我們使用len()來(lái)確定這個(gè)列表 的長(zhǎng)度時(shí),就知道了原始字符串大致包含多少個(gè)單詞(見(jiàn)?)。在?處,我們打印一條消息,指 出文件包含多少個(gè)單詞。這些代碼都放在else代碼塊中,因?yàn)閮H當(dāng)try代碼塊成功執(zhí)行時(shí)才執(zhí)行 它們。輸出指出了文件alice.txt包含多少個(gè)單詞:
The file alice.txt has about 29461 words.
這個(gè)數(shù)字有點(diǎn)大,因?yàn)檫@里使用的文本文件包含出版商提供的額外信息,但與童話Alice in Wonderland的長(zhǎng)度相當(dāng)一致。
10.3.7 使用多個(gè)文件
下面多分析幾本書。這樣做之前,我們先將這個(gè)程序的大部分代碼移到一個(gè)名為 count_words()的函數(shù)中,這樣對(duì)多本書進(jìn)行分析時(shí)將更容易:
word_count.py
def count_words(filename):
1 """計(jì)算一個(gè)文件大致包含多少個(gè)單詞"""
try:
with open(filename) as f_obj:
contents = f_obj.read()
except FileNotFoundError:
msg = "Sorry, the file " + filename + " does not exist."
print(msg)
else:
# 計(jì)算文件大致包含多少個(gè)單詞
words = contents.split()
num_words = len(words)
print("The file " + filename + " has about " + str(num_words) +
" words.")
filename = 'alice.txt'
count_words(filename)
這些代碼大都與原來(lái)一樣,我們只是將它們移到了函數(shù)count_words()中,并增加了縮進(jìn)量。 修改程序的同時(shí)更新注釋是個(gè)不錯(cuò)的習(xí)慣,因此我們將注釋改成了文檔字符串,并稍微調(diào)整了一下措辭(見(jiàn)1)。
現(xiàn)在可以編寫一個(gè)簡(jiǎn)單的循環(huán),計(jì)算要分析的任何文本包含多少個(gè)單詞了。為此,我們將要 分析的文件的名稱存儲(chǔ)在一個(gè)列表中,然后對(duì)列表中的每個(gè)文件都調(diào)用count_words()。我們將 嘗試計(jì)算Alice in Wonderland、Siddhartha、Moby Dick和Little Women分別包含多少個(gè)單詞,它們 都不受版權(quán)限制。我故意沒(méi)有將siddhartha.txt放到word_count.py所在的目錄中,讓你能夠看到這 個(gè)程序在文件不存在時(shí)處理得有多出色:
def count_words(filename):
--snip--
filenames = ['alice.txt', 'siddhartha.txt', 'moby_dick.txt', 'little_women.txt']
for filename in filenames:
count_words(filename)
文件siddhartha.txt不存在,但這絲毫不影響這個(gè)程序處理其他文件:
The file alice.txt has about 29461 words.
Sorry, the file siddhartha.txt does not exist.
The file moby_dick.txt has about 215136 words.
The file little_women.txt has about 189079 words.
在這個(gè)示例中,使用try-except代碼塊提供了兩個(gè)重要的優(yōu)點(diǎn):避免讓用戶看到traceback; 讓程序能夠繼續(xù)分析能夠找到的其他文件。如果不捕獲因找不到siddhartha.txt而引發(fā)的 FileNotFoundError異常,用戶將看到完整的traceback,而程序?qū)⒃趪L試分析Siddhartha后停止運(yùn) 行——根本不分析Moby Dick和Little Women。
10.3.8 失敗時(shí)一聲不吭
在前一個(gè)示例中,我們告訴用戶有一個(gè)文件找不到。但并非每次捕獲到異常時(shí)都需要告訴用 戶,有時(shí)候你希望程序在發(fā)生異常時(shí)一聲不吭,就像什么都沒(méi)有發(fā)生一樣繼續(xù)運(yùn)行。要讓程序在 失敗時(shí)一聲不吭,可像通常那樣編寫try代碼塊,但在except代碼塊中明確地告訴Python什么都不 要做。Python有一個(gè)pass語(yǔ)句,可在代碼塊中使用它來(lái)讓Python什么都不要做:
def count_words(filename):
"""計(jì)算一個(gè)文件大致包含多少個(gè)單詞"""
try:
--snip--
except FileNotFoundError:
1 pass
else:
--snip--
filenames = ['alice.txt', 'siddhartha.txt', 'moby_dick.txt', 'little_women.txt']
for filename in filenames:
count_words(filename)
相比于前一個(gè)程序,這個(gè)程序唯一不同的地方是 ? 處 的 pass 語(yǔ)句?,F(xiàn)在,出現(xiàn) FileNotFoundError異常時(shí),將執(zhí)行except代碼塊中的代碼,但什么都不會(huì)發(fā)生。這種錯(cuò)誤發(fā)生時(shí), 不會(huì)出現(xiàn)traceback,也沒(méi)有任何輸出。用戶將看到存在的每個(gè)文件包含多少個(gè)單詞,但沒(méi)有任何 跡象表明有一個(gè)文件未找到:
The file alice.txt has about 29461 words.
The file moby_dick.txt has about 215136 words.
The file little_women.txt has about 189079 words.
pass語(yǔ)句還充當(dāng)了占位符,它提醒你在程序的某個(gè)地方什么都沒(méi)有做,并且以后也許要在這 里做些什么。例如,在這個(gè)程序中,我們可能決定將找不到的文件的名稱寫入到文件 missing_files.txt中。用戶看不到這個(gè)文件,但我們可以讀取這個(gè)文件,進(jìn)而處理所有文件找不到 的問(wèn)題。
關(guān)于“Python”的核心知識(shí)點(diǎn)整理大全24-CSDN博客
關(guān)于“Python”的核心知識(shí)點(diǎn)整理大全23-CSDN博客
關(guān)于“Python”的核心知識(shí)點(diǎn)整理大全22-CSDN博客
關(guān)于“Python”的核心知識(shí)點(diǎn)整理大全21-CSDN博客
關(guān)于“Python”的核心知識(shí)點(diǎn)整理大全20-CSDN博客
關(guān)于“Python”的核心知識(shí)點(diǎn)整理大全19-CSDN博客
關(guān)于“Python”的核心知識(shí)點(diǎn)整理大全18-CSDN博客
關(guān)于“Python”的核心知識(shí)點(diǎn)整理大全17-CSDN博客
Python:核心知識(shí)點(diǎn)整理大全16-筆記-CSDN博客
關(guān)于“Python”的核心知識(shí)點(diǎn)整理大全15-CSDN博客
關(guān)于“Python”的核心知識(shí)點(diǎn)整理大全14-CSDN博客
關(guān)于“Python”的核心知識(shí)點(diǎn)整理大全13-CSDN博客文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-760227.html
關(guān)于“Python”的核心知識(shí)點(diǎn)整理大全12-CSDN博客文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-760227.html
往期快速傳送門??(在文章最后):
感謝大家的支持!歡迎訂閱收藏!專欄將持續(xù)更新!
到了這里,關(guān)于關(guān)于“Python”的核心知識(shí)點(diǎn)整理大全25的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!