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

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

生活随笔

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

python

python文件操作与异常处理_Python学习——文件操作和异常处理

發(fā)布時(shí)間:2025/3/20 python 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python文件操作与异常处理_Python学习——文件操作和异常处理 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在上一篇文章中,我們介紹了 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)題。

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