今天要介紹常見的IO操作,流程:開檔 >> 處理 >> 關檔,下面來講解一些Python中的檔案讀寫方法
# 開檔
放檔案的變數 = open( "檔案路徑" , mode = "開啟的模式" , encoding = "編碼格式" )
開啟的模式有下列幾種
# 開檔
放檔案的變數 = open( 檔案路徑 , mode = "開啟的模式" , encoding = "編碼格式" )
#讀取全部文字
變數 = 放檔案的變數.read()
#一行一行的讀取文字
for 變數 in 放檔案的變數:
將文字從 放檔案的變數 一行一行的放入 變數 中
#寫入檔案
放檔案的變數.write(字串)
#關閉檔案
放檔案的變數.close()
而上面這種寫法雖然沒有問題,但缺點就是必須手動加入關閉檔案的程式碼,不是很方便,也很容易忘記,除了以上的方法,比較常見的是with
關鍵字,在程式中對於檔案和資源的管理是非常重要的,開啟外部的檔案要是沒有被關閉,它就會一直佔據著記憶體,而with
關鍵字可讓我們更容易管理這些開啟的資源,在with
區塊之下,python 程式會自動進行資源的建立、清理與回收動作,這樣的好處是with
區塊執行完畢會自動安全的關閉檔案,with
不僅可以用來開檔,也能用來開網頁,使用方式如下
with open( 檔案路徑 , mode = "開啟的模式" , encoding = "編碼格式" ) as 變數:
讀取或寫檔的程式區塊
此區塊執行完畢會自動的關閉檔案
將可能會出錯的程式碼放在try
的區塊下,當try
的區塊裡面出現錯誤時,就執行except
區塊內的程式碼,可想而知,程式錯誤千百種,except
區塊預設為只要發生錯誤就執行,當然,except
區塊也能設定成只有發生特定的錯誤才執行,這種設定稱為錯誤捕捉,操作方式如下
try:
程式區塊......
except:
如果上方程式發生錯誤,則執行此程式區塊
錯誤捕捉的方式為,在except
後方加上異常名稱,就可以設定成當發生該異常時在執行except
區塊,至於異常名稱有哪些呢?我們可以看一下python標準異常這個東西
異常名稱 | 描述 |
---|---|
BaseException | 所有異常的基類 |
SystemExit | 直譯器請求退出 |
KeyboardInterrupt | 使用者中斷執行(通常是輸入^C) |
Exception | 常規錯誤的基類 |
StopIteration | 迭代器沒有更多的值 |
GeneratorExit | 生成器(generator)發生異常來通知退出 |
SystemExit | Python 直譯器請求退出 |
StandardError | 所有的內建標準異常的基類 |
ArithmeticError | 所有數值計算錯誤的基類 |
FloatingPointError | 浮點計算錯誤 |
OverflowError | 數值運算超出最大限制 |
ZeroDivisionError | 除(或取模)零 (所有資料型別) |
AssertionError | 斷言語句失敗 |
AttributeError | 物件沒有這個屬性 |
EOFError | 沒有內建輸入,到達EOF 標記 |
EnvironmentError | 作業系統錯誤的基類 |
IOError | 輸入/輸出操作失敗 |
OSError | 作業系統錯誤 |
WindowsError | 系統呼叫失敗 |
ImportError | 匯入模組/物件失敗 |
KeyboardInterrupt | 使用者中斷執行(通常是輸入^C) |
LookupError | 無效資料查詢的基類 |
IndexError | 序列中沒有沒有此索引(index) |
KeyError | 對映中沒有這個鍵 |
MemoryError | 記憶體溢位錯誤(對於Python 直譯器不是致命的) |
NameError | 未宣告/初始化物件 (沒有屬性) |
UnboundLocalError | 訪問未初始化的本地變數 |
ReferenceError | 弱引用(Weak reference)試圖訪問已經垃圾回收了的物件 |
RuntimeError | 一般的執行時錯誤 |
NotImplementedError | 尚未實現的方法 |
SyntaxError | Python 語法錯誤 |
IndentationError | 縮排錯誤 |
TabError | Tab 和空格混用 |
SystemError | 一般的直譯器系統錯誤 |
TypeError | 對型別無效的操作 |
ValueError | 傳入無效的引數 |
UnicodeError | Unicode 相關的錯誤 |
UnicodeDecodeError | Unicode 解碼時的錯誤 |
UnicodeEncodeError | Unicode 編碼時錯誤 |
UnicodeTranslateError | Unicode 轉換時錯誤 |
Warning | 警告的基類 |
DeprecationWarning | 關於被棄用的特徵的警告 |
FutureWarning | 關於構造將來語義會有改變的警告 |
OverflowWarning | 舊的關於自動提升為長整型(long)的警告 |
PendingDeprecationWarning | 關於特性將會被廢棄的警告 |
RuntimeWarning | 可疑的執行時行為(runtime behavior)的警告 |
SyntaxWarning | 可疑的語法的警告 |
UserWarning | 使用者程式碼生成的警告 |
操作方式如下 |
try:
程式區塊......
except 異常名稱 as 異常名稱別名:
如果上方程式發生指定的異常,則執行此程式區塊
範例
try:
# 讀取myfile.ext檔案
files = open( "./myfile.ext" , mode = "r" , encoding = "utf-8" )
except IOError as e:
# 如果myfile.ext檔案不存在,就會觸發IO錯誤,執行以下區塊
print(e)
print("檔案不存在")
還有捕捉多重錯誤的方式
try:
程式區塊......
except (異常名稱1,異常名稱2) as 異常名稱別名A:
如果上方程式發生指定的異常,則執行此程式區塊
except (異常名稱3,異常名稱4) as 異常名稱別名B:
如果上方程式發生指定的異常,則執行此程式區塊
另外再來題一下try...except...else...finally...敘述,else...finally...並不是絕對必要的敘述,else
區塊在try
區塊正常的執行完成後會執行,也就是說沒有發生異常才會執行,finally
區塊就是無論如何最終一定會執行,操作如下
try:
程式區塊......
except (異常名稱1,異常名稱2) as 異常名稱別名A:
如果上方程式發生指定的異常,則執行此程式區塊
except (異常名稱3,異常名稱4) as 異常名稱別名B:
如果上方程式發生指定的異常,則執行此程式區塊
...如果有需要可以繼續增加except區塊
else:
try區塊順利執行完畢,沒有發生任何錯誤時執行
finally:
無論如何最後都會執行