作者 | 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函數
一次讀取整個文件
逐行讀取文件
覆蓋已有內容寫入文件
追加內容寫入文件
異常處理不建議隨便亂用,過度使用使得代碼可讀性變差;在異常無法預知的情況下建議使用異常處理,其他異常盡量解決。
可能觸發異常的代碼會放到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語句塊處理
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.
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中的代碼塊不管異常是否被觸發都會被執行,常用來在腳本執行之後做清理工作。
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:
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.
try:
raise IOError('一個主動觸發的異常類型')#這個異常主動觸發
except Exception as e:
print(e.args)
('一個主動觸發的異常類型',)
try:
assert False,"前面bool判斷為False是觸發異常"
except Exception as e:
print(e.args)
('前面bool判斷為False是觸發異常',)
只見過幾個,如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
與資源使用相關的警告的基類。會被默認的警告過濾器忽略。
語法: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幾個常用的數據結構!
分享
點收藏
點點贊
點在看