python文件操作与异常处理_Python学习——文件操作和异常处理
在上一篇文章中,我們介紹了 Python 的函數(shù)和模塊,現(xiàn)在我們介紹?Python 中的異常和文件。
查看上一篇文章請(qǐng)點(diǎn)擊:https://www.cnblogs.com/dustman/p/9963920.html
異常和文件
異常
異常也叫例外。在之前的幾篇文章中,你已經(jīng)看到過(guò)異常。當(dāng)程序運(yùn)行錯(cuò)誤是出現(xiàn),比如不正確的調(diào)用和代碼不規(guī)范等。當(dāng)你的程序出現(xiàn)意外情況是就會(huì)發(fā)生異常并終止運(yùn)行。
下面代碼用 5 除以 0 產(chǎn)生 ZeroDivisionError 異常。
num1 = 5num2=0print(num1/num2)
運(yùn)行結(jié)果:
>>>ZeroDivisionError: division by zero>>>
不同的原因產(chǎn)生不同的異常,一般有:
ImportError:引入模塊錯(cuò)誤,通常是模塊不存在。
IndexError:讀取列表超出索引范圍。
NameError:使用未聲明的變量。
SyntaxError:代碼語(yǔ)法錯(cuò)誤。
TypeError:當(dāng)操作或函數(shù)處理不合適類型。
ValueError:內(nèi)建操作或函數(shù),接收到類型正確,但值不正確。
Python 還有其他幾個(gè)內(nèi)置的異常,比如 ZeroDivisionError和 OSError。第三方庫(kù)也經(jīng)常定義自己的異常。
異常處理
我們使用try/except 語(yǔ)句捕捉程序運(yùn)行時(shí)產(chǎn)生的異常。
try 塊用來(lái)包含可能產(chǎn)生異常的代碼塊。如果產(chǎn)生異常 try 塊停止運(yùn)行,except 塊里的代碼開始執(zhí)行,如果程序運(yùn)行一切正常,則不會(huì)執(zhí)行 except 塊里的代碼。
try:
num1= 5num2=0print(num1/num2)print("Done!")exceptZeroDivisionError:print("Has a error")print("due to zero division")
運(yùn)行結(jié)果:
>>>Has a error
due to zero division>>>
上面的例子里 except語(yǔ)句定義了 ZeroDivisionError異常捕捉。
try語(yǔ)句可以擁有多個(gè) except 定義語(yǔ)句來(lái)處理異常。多個(gè)異常也可以使用一個(gè) except 塊來(lái)捕捉。
try:
var= 5
print(var + "string!")print(var/2)exceptZeroDivisionError:print("Divided by zero!")except(ValueError,TypeError):print("Has a error!")
運(yùn)行結(jié)果:
>>>Has a error!>>>
except 語(yǔ)句如果沒有申明要鋪獲的異常,將捕獲所有的異常。我們應(yīng)該謹(jǐn)慎地使用這種異常處理方式,它雖然捕獲了意外錯(cuò)誤但是卻把編程錯(cuò)誤隱藏了。
try:
var= 5
print(var + "string!")print(var/2)except:print("An error occurred")
運(yùn)行結(jié)果:
>>>An error occurred>>>
這種異常處理方式通常用在處理用戶輸入。
finally 語(yǔ)句
假設(shè)你正在讀取一份文件。你應(yīng)該確保文件對(duì)象被正確關(guān)閉,無(wú)論是否會(huì)發(fā)生異常。
為了確保代碼最終能夠運(yùn)行不論是否有異常發(fā)生,我們可以使用 finally 語(yǔ)句。finally 放在try/except 語(yǔ)句的后面。
try:
str= "Hello"var= 5
print(str)print(var/0)exceptZeroDivisionError:print("Divided by zero")finally:print("This code will run no matter what")
運(yùn)行結(jié)果:
>>>Hello
Divided by zero
This code will run no matter what>>>
下面代碼會(huì)輸出什么?
try:print(1)except:print("a")finally:print("Hello")
運(yùn)行結(jié)果:
>>>
1Hello>>>
finally 語(yǔ)句最終會(huì)被執(zhí)行不管前面的異常到?jīng)]有捕捉到,包括在 except 語(yǔ)句里產(chǎn)生的異常。
try:print(1)print(5/0)exceptZeroDivisionError:print(Error_var)finally:print("This is executed last!")
運(yùn)行結(jié)果:
>>>
1
This is executed last!
ZeroDivisionError: division by zero
During handling of the above exception, another exception occurred:
NameError: name 'Error_var' is not defined
>>>
拋出異常
使用 raise 語(yǔ)句拋出一個(gè)異常
print(1)raiseZeroDivisionErrorprint(5)
運(yùn)行結(jié)果:
>>>
1ZeroDivisionError>>>
你需要聲明你要拋出的例外名稱。
拋出的異常可以用參數(shù)來(lái)指出這是什么錯(cuò)誤。
age = 12
raise TypeError("Invalid type!")
運(yùn)行結(jié)果:
>>>TypeError("Invalid type!")>>>
在 except 塊里,raise 語(yǔ)句可以不用聲明異常的名稱重新拋出捕捉到的異常。
try:
num= 5/0except:print("Has a error")raise
運(yùn)行結(jié)果:
>>>ZeroDivisionError: division by zero
Has a error>>>
斷言
Python 的斷言就是檢測(cè)一個(gè)條件。如果條件為真,它什么都不做,條件為假會(huì)觸發(fā)一個(gè)錯(cuò)誤信息。
斷言可以打開或關(guān)閉。斷言使用 assert 語(yǔ)句聲明。
print(1)assert 1 + 2 == 3
print("Yes")assert 1 + 1 ==0print("Yes")
運(yùn)行結(jié)果:
>>>
1Yes
AssertionError>>>
程序員通常在函數(shù)的開頭放置斷言以檢查有效的輸入,在函數(shù)調(diào)用之后放置斷言以檢查有效的輸出。
斷言可以在運(yùn)行是通過(guò)添加-O 或 -OO 選項(xiàng)來(lái)關(guān)閉。
下面代碼打印出來(lái)什么?
print(1)assert 1 != 2
print(2)assertTrueprint(3)assertFalseprint(4)assert 1 + 1 == 2
print(5)
運(yùn)行結(jié)果:
>>>
1
2
3AssertionError>>>
斷言的第二個(gè)參數(shù)可以用來(lái)給 AssertionError 做參數(shù)。
num = 5
assert (num <= 0),"The num is bigger than zero"
運(yùn)行結(jié)果:
>>>AssertionError: The numisbigger than zero>>>
AssertionError異常可以像任何其他異常一樣使用try/except語(yǔ)句被捕捉和處理,如果程序不處理,這種類型的異常將終止程序的運(yùn)行。
文件處理
打開文件
讀寫文件是最常見的 IO(輸入輸出)操作。Python 內(nèi)置了讀寫文件的函數(shù),要讀寫文件需要打開一個(gè)文件對(duì)象,使用 open 函數(shù)。
open 函數(shù)打開的對(duì)象在 Python 中統(tǒng)稱為file-like Object。除了文件外,還可以是內(nèi)存的字節(jié)流,網(wǎng)絡(luò)流,自定義流等等。
f = open("test.txt")
注意:open函數(shù)的參數(shù)是文件的路徑。如果文件與程序位于同一個(gè)目錄中,則可以不要指定路徑直接使用文件名。
可以使用 open 函數(shù)的第二個(gè)參數(shù)來(lái)指定打開文件的模式。
#read mode
open("test.txt", "r")
open("test.txt")#write mode
open("test.txt", "w")#binary write mode
open("test.txt", "wb")
打開文件模式列表:
特別注意:使用 "w" 模式時(shí),如果文件已經(jīng)存在,會(huì)把舊文件的內(nèi)容全部都清除掉。
文件打開后應(yīng)該使用 close 方法關(guān)閉文件。
f = open("test.txt","w")#close the file
f.close()
接下來(lái)我們會(huì)讀取和寫入文件。
讀取文件
使用 open 方法打開的文件可以使用 read 方式來(lái)讀取內(nèi)容。
f = open("test.txt","r")
content=f.read()print(content)
f.close()
打印文件名為 "test.txt" 的所有內(nèi)容。
若要讀取一定數(shù)量的文件內(nèi)容,可以使用一個(gè)數(shù)字作為參數(shù)來(lái)調(diào)用 read 函數(shù)。該數(shù)字確定要讀取多少個(gè)字節(jié)的內(nèi)容。
可以對(duì)同一個(gè)文件對(duì)象進(jìn)行多次的 read 調(diào)用,該字節(jié)讀取文件內(nèi)容。在沒有參數(shù)的情況下,read 函數(shù)返回文件的其余部分。
f = open("test.txt","r")print(f.read(32))print(f.read(16))print(f.read(8))print(f.read())
f.close()
當(dāng)所有的內(nèi)容被讀取后,再調(diào)用 read 函數(shù)返回空字符串。
f = open("test.txt","r")
f.read()print("reading")print(f.read())print("finished!")
f.close()
運(yùn)行結(jié)果:
>>>
reading
finished!>>>
打開一個(gè)文件讀取它的內(nèi)容,打印內(nèi)容的長(zhǎng)度。
f = open("test.txt","r")
str=f.read()print(len(str))
f.close()
運(yùn)行結(jié)果:
>>>
16
>>>
要一行一行地讀取,我們可以使用 readline 方法,也使用 readlines 一次讀取所有內(nèi)容并返回一個(gè)列表,列表里的每一項(xiàng)元素表示一行內(nèi)容。
f = open("test.txt","r")print(f.readlines())
f.close()
運(yùn)行結(jié)果:
>>>['I like Python!!!']>>>
使用 for 語(yǔ)句遍歷文件的每一行:
f = open("test.txt","r")for line inf:print(line)
f.close()
運(yùn)行結(jié)果:
>>>Line1: Hello world!
Line2: I like Python!
Line3: I like Java!>>>
在輸出中,返回的行包含換行符,打印 print函數(shù)在輸出的末尾自動(dòng)添加新行。
寫文件
使用 write 方法把內(nèi)容寫到文件里。
f = open("test.txt","w")
f.write("I am happy!")
f.close()
f= open("test.txt","r")print(f.read())
f.close()
運(yùn)行結(jié)果:
>>>I am happy!>>>
如果文件不存在,"w" 將會(huì)創(chuàng)建一個(gè)文件。
寫入模式下,如果文件存在將清除全部?jī)?nèi)容并往文件寫入新內(nèi)容。
f = open("test.txt","r")print("Reading...")print(f.read())print("Finished!")
f.close()
f= open("test.txt","w")
f.write("New text")
f.close()
f= open("test.txt","r")print("Reading new contents")print(f.read())print("Finished!")
f.close()
運(yùn)行結(jié)果:
>>>Reading...
I am happy!
Finished!
Reading new contents
New text
Finished!>>>
特別注意:原有的文件將被新內(nèi)容重寫。
如果 write 寫入成功,方法返回寫入的字節(jié)數(shù)。
msg = "I like Python!!!"f= open("test.txt","w")
count=f.write(msg)print(count)
f.close()
運(yùn)行結(jié)果:
>>>
16
>>>
讀寫文件
確保文件在使用后始終關(guān)閉,避免浪費(fèi)資源是良好的編程習(xí)慣。我們使用try/finally 語(yǔ)句。
try:
f= open("test.txt")print(f.read())finally:
f.close()
當(dāng)異常發(fā)生時(shí)也能確保文件對(duì)象被正確關(guān)閉。
每次都這樣要關(guān)閉文件是在太繁瑣。所以,Python 引入了 with 語(yǔ)句來(lái)幫我們自動(dòng)調(diào)用close() 方法。
with open("test.txt") as f:print(f.read())
使用 with語(yǔ)句打開文件是個(gè)好習(xí)慣,就算有例外發(fā)生,with語(yǔ)句也會(huì)自動(dòng)幫我們關(guān)閉文件句柄。
總結(jié)
以上是生活随笔為你收集整理的python文件操作与异常处理_Python学习——文件操作和异常处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: wxpython安装_01Python安
- 下一篇: python 仿真实验_生成仿真的演化网