程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

詳解 Python 異常處理、文件讀寫

編輯:Python

作者 | pythonic生物人

來源 | pythonic生物人

詳細梳理python異常處理方法:try/except/else/finally/raise/assert

詳細梳理python文件讀寫:open/write

目錄

1.異常處理
處理單個異常:try/except
多個異常一種方式處理:元組包含多個異常類型
多個異常各自特異處理:多個except語句
處理所有異常:Exception 捕獲所有異常
腳本執行之後做清理工作:finally
沒有觸發異常的時候執行一些任務:try/else
主動觸發某個異常類型:raise
滿足某個條件觸發異常:assert
python3中內置標准異常類型
2.Python中文件讀寫
python3中open函數
一次讀取整個文件
逐行讀取文件
覆蓋已有內容寫入文件
追加內容寫入文件

1.異常處理

異常處理不建議隨便亂用,過度使用使得代碼可讀性變差;在異常無法預知的情況下建議使用異常處理,其他異常盡量解決。

處理單個異常:try/except

可能觸發異常的代碼會放到try語句塊裡,處理異常的代碼放在except語句塊裡。

try:#try代碼塊中任何一行代碼報錯,該行代碼後面的語句就不會執行,拋出錯誤類型。
    file = open('test', 'rb')
except IOError as e:
#IOError為異常類型,如果try中拋出的錯誤正好是該異常類型,執行except中代碼處理掉異常,程序繼續執行,否則終止程序。
    print('An IOError occurred. {}'.format(e.args[-1]))#處理異常的代碼 。

An IOError occurred. No such file or directory

多個異常一種方式處理:元組包含多個異常類型

把所有可能發生的異常類型存儲到一個元組中。

try:
    file = open('test', 'rb')
except (IOError, EOFError) as e:#多個異常類型存儲在(IOError, EOFError)元組中
    print("An error occurred. {}".format(e.args[-1]))

An error occurred. No such file or directory

多個異常各自特異處理:多個except語句

對每個異常類型使用一個except語句塊處理

try:
    file = open('test', 'rb')
except EOFError as e:#該except處理EOFError類型異常
    print("An EOF error occurred.")
except IOError as e:#該except處理IOFError類型異常
    print("An error occurred.")

An error occurred.

處理所有異常:Exception 捕獲所有異常

try:
    file = open('test', 'rb')
except Exception as e:#Exception捕獲所有的異常類型,保存到args的元組中。
    print('All exceptions {}'.format(e.args))

All exceptions (2, 'No such file or directory')

腳本執行之後做清理工作:finally

finally中的代碼塊不管異常是否被觸發都會被執行,常用來在腳本執行之後做清理工作。

try:
    file = open('test', 'rb')
except IOError as e:
    print('An IOError occurred. {}'.format(e.args[-1]))
finally:#該語句塊一定會執行,無論try中是否觸發代碼,無論except中是否處理異常。
    print("This would be printed whether or not an exception occurred!")

An IOError occurred. No such file or directory
This would be printed whether or not an exception occurred!

沒有觸發異常的時候執行一些任務:try/else

try代碼塊中異常沒被觸發,執行else語句塊。

try:
    print('I am sure no exception is going to occur!')
except Exception:
    print('exception')
else:#try語句塊沒有觸發異常時運行;該代碼塊中異常不會被捕獲。
    print('This would only run if no exception occurs. And an error here '
          'would NOT be caught.')
finally:
    print('This would be printed in every case.')

I am sure no exception is going to occur!
This would only run if no exception occurs. And an error here would NOT be caught.
This would be printed in every case.

主動觸發某個異常類型:raise

try:
    raise IOError('一個主動觸發的異常類型')#這個異常主動觸發
except Exception as e:
    print(e.args)

('一個主動觸發的異常類型',)

滿足某個條件觸發異常:assert

try:
    assert False,"前面bool判斷為False是觸發異常"
except Exception as e:
    print(e.args)

('前面bool判斷為False是觸發異常',)

python3中內置標准異常類型

只見過幾個,如ZeroDivisionError、ImportError、IndexError、KeyError、TypeError、ValueError、SystemError等少數幾個。python3中內置的異常類型及各異常之間的繼承關系,各異常類型的觸發原因見下表:

python內置標准異常類型

及繼承關系(python3.8.3)

觸發異常原因

BaseException

所有內置異常的基類。

 +-- SystemExit

sys.exit()函數引發。

 +-- KeyboardInterrupt

當用戶按下中斷鍵(通常為Control-C或Delete)時將被引發。

 +-- GeneratorExit

當一個生成器generator或coroutine被關閉時將被引發

 +-- Exception

所有內置的非系統退出類異常和自定義異常都派生自此類。

      +-- StopIteration

內置函數next()和迭代器iterator的__next__()方法所引發。

      +-- StopAsyncIteration

由一個asynchronous iterator對象的__anext__()方法來引發以停止迭代操作。

      +-- ArithmeticError

各種算術類錯誤而引發的內置異常

      |    +-- FloatingPointError

目前未被使用,呵呵~。

      |    +-- OverflowError

當算術運算的結果大到無法表示時將被引發。

      |    +-- ZeroDivisionError

當除法或取余運算的分母為零時將被引發。

      +-- AssertionError

當assert(bool判斷觸發異常)語句失敗時將被引發。

      +-- AttributeError

當屬性引用或賦值失敗時將被引發(經常見)。

      +-- BufferError

當與緩沖區相關的操作無法執行時將被引發。

      +-- EOFError

當input()函數未讀取任何數據即達到文件結束條件(EOF)時將被引發。

      +-- ImportError

導入模塊時引發,當import加載模塊和from/import中的"from list"存在無法找到的名稱時被引發。

      |    +-- ModuleNotFoundError

一個模塊無法被定位時將由import引發,當在sys.modules中找到None時也會被引發。

      +-- LookupError

IndexError,KeyError異常引發及codecs.lookup()直接引發。

      |    +-- IndexError

超過序列類數據結構(list,str等)索引范圍時將被引發。

      |    +-- KeyError

映射類數據結構(dict)中找不到鍵時將被引發。

      +-- MemoryError

當一個操作耗盡內存但情況仍可(通過刪除一些對象)進行挽救時將被引發。

      +-- NameError

當某個局部或全局名稱未找到時將被引發。

      |    +-- UnboundLocalError

當在函數或方法中對某個局部變量進行引用,但該變量並未綁定任何值時將被引發。

      +-- OSError

根據系統錯誤代碼被引發。

      |    +-- BlockingIOError

當一個操作會被某個設置為非阻塞操作的對象(例如套接字)所阻塞時將被引發。

      |    +-- ChildProcessError

當一個子進程上的操作失敗時將被引發。對應於errno ECHILD。

      |    +-- ConnectionError

與連接相關異常的基類。

      |    |    +-- BrokenPipeError

當試圖寫入另一端已被關閉的管道,或是試圖寫入已關閉寫入的套接字時將被引發。對應於errno EPIPE和ESHUTDOWN。

      |    |    +-- ConnectionAbortedError

當連接嘗試被對端中止時將被引發。對應於errno ECONNABORTED。

      |    |    +-- ConnectionRefusedError

當連接嘗試被對端拒絕時將被引發。對應於errno ECONNREFUSED。

      |    |    +-- ConnectionResetError

當連接被對端重置時將被引發。對應於errno ECONNRESET。

      |    +-- FileExistsError

當試圖創建一個已存在的文件或目錄時將被引發。對應於 errno EEXIST。

      |    +-- FileNotFoundError

當所請求的文件或目錄不存在時將被引發。對應於errno ENOENT。

      |    +-- InterruptedError

當系統調用被輸入信號中斷時將被引發。對應於errno EINTR。

      |    +-- IsADirectoryError

當請求對一個目錄執行文件操作(例如os.remove())將被引發。對應於errno EISDIR。

      |    +-- NotADirectoryError

當請求對一個非目錄對象執行目錄操作(例如os.listdir())時將被引發。對應於errno ENOTDIR。

      |    +-- PermissionError

當在沒有足夠操作權限的情況下試圖執行某個操作時將被引發——例如缺少文件系統權限。對應於errno EACCES和EPERM。

      |    +-- ProcessLookupError

當給定的進程不存在時將被引發。對應於errno ESRCH。

      |    +-- TimeoutError

當一個系統函數發生系統級超時的情況下將被引發。對應於errno ETIMEDOUT。

      +-- ReferenceError

此異常將在使用weakref.proxy()函數所創建的弱引用來訪問該引用的某個已被作為垃圾回收的屬性時被引發。

      +-- RuntimeError

當檢測到一個不歸屬於任何其他類別的錯誤時將被引發。關聯的值是一個指明究竟發生了什麼問題的字符串。

      |    +-- NotImplementedError

在用戶自定義的基類中,抽象方法應當在其要求所派生類重載該方法,或是在其要求所開發的類提示具體實現尚待添加時引發此異常。

      |    +-- RecursionError

解釋器檢測發現超過最大遞歸深度被引發。

      +-- SyntaxError

當解析器遇到語法錯誤時將被引發。

      |    +-- IndentationError

與不正確的縮進相關的語法錯誤的基類。

      |         +-- TabError

當縮進包含對制表符和空格符不一致的使用時將被引發。

      +-- SystemError

當解釋器發現內部錯誤,但情況看起來尚未嚴重到要放棄所有希望時將被引發。

      +-- TypeError

當一個操作或函數被應用於類型不適當的對象時將被引發。

      +-- ValueError

當操作或函數接收到具有正確類型但值不適合的參數,並且情況不能用更精確的異常例如IndexError來描述時將被引發。

      |    +-- UnicodeError

當發生與Unicode相關的編碼或解碼錯誤時將被引發。

      |         +-- UnicodeDecodeError

當在"解碼過程"中發生與Unicode相關的錯誤時將被引發。

      |         +-- UnicodeEncodeError

當在"編碼過程"中發生與Unicode相關的錯誤時將被引發。

      |         +-- UnicodeTranslateError

在"轉寫過程"中發生與Unicode相關的錯誤時將被引發。

      +-- Warning

警告類別的基類。

           +-- DeprecationWarning

如果所發出的警告是針對其他Python開發者的,則以此作為與已棄用特性相關警告的基類。

           +-- PendingDeprecationWarning

對於已過時並預計在未來棄用,但目前尚未棄用的特性相關警告的基類。

           +-- RuntimeWarning

與模糊的運行時行為相關的警告的基類。

           +-- SyntaxWarning

與模糊的語法相關的警告的基類。

           +-- UserWarning

用戶代碼所產生警告的基類。

           +-- FutureWarning

如果所發出的警告是針對以Python所編寫應用的最終用戶的,則以此作為與已棄用特性相關警告的基類。

           +-- ImportWarning

與在模塊導入中可能的錯誤相關的警告的基類。

           +-- UnicodeWarning

與Unicode相關的警告的基類。

           +-- BytesWarning

與bytes和bytearray相關的警告的基類。

           +-- ResourceWarning

與資源使用相關的警告的基類。會被默認的警告過濾器忽略。


2.Python中文件讀寫

python3中open函數

語法:open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

file,被打開的文件;
mode,打開模式,默認為‘r’即讀取模式;
詳細如下表:

字符

含義

'r'

讀取(默認)

'w'

覆蓋寫入,如果文件中已有內容,則覆蓋

'x'

排它性創建,如果文件已存在則失敗

'a'

追加寫入,如果文件已有內容,則在末尾追加

'b'

二進制模式

't'

文本模式(默認)

'+'

更新磁盤文件(讀取並寫入)

buffering,設置緩沖;encoding,一般使用utf8,沒有指定,則根據平台來決定使用的編碼;......(後面的我很少用)

一次讀取整個文件

file = './test.txt'#指定文件路徑及文件
with open(file,encoding='gbk') as f:#關鍵字with 在不再需要訪問文件後自動將其關閉,所以不需要close關閉文件。
    contents = f.read()#方法read()讀取文件的全部內容,以字符串的形式存儲在變量contents中    
print(contents)

逐行讀取文件

file = './test.txt'
with open(file) as f:
    for line in f:#使用for循環
        line = line.strip()#strip去掉每行末尾換行符
        print(line)

覆蓋已有內容寫入文件

file = './test.txt'
with open(file,encoding='gbk') as f:
    contents = f.read()
with open("./test1.txt", 'w') as f:#'w'覆蓋已有文件內容
    f.write(contents)

#test1.txt中內容

追加內容寫入文件

file = './test.txt'
with open(file,encoding='gbk') as f:
    contents = f.read()
with open("./test1.txt", 'w') as f:#'w'覆蓋已有文件內容
    f.write(contents)

test1.txt中內容,末尾追加了一行,不覆蓋已有內容。

往期回顧

NLP 類問題建模方案探索實踐

Python 爬蟲中的常見加密算法!

2D變身3D,來看英偉達的AI“新”魔法!

搞定Python幾個常用的數據結構!

分享
點收藏
點點贊
點在看

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved