iT邦幫忙

2021 iThome 鐵人賽

DAY 7
0
自我挑戰組

終極大數據地獄系列 第 7

#7 Python進階教學4

IO

今天要介紹常見的IO操作,流程:開檔 >> 處理 >> 關檔,下面來講解一些Python中的檔案讀寫方法

# 開檔
放檔案的變數 = open( "檔案路徑" , mode = "開啟的模式" , encoding = "編碼格式" )

開啟的模式有下列幾種

  • r:讀取模式,讀取存在的檔案
  • w:寫入模式,新建檔案寫入,如果檔案原本就存在,就清空
  • a:資料加到舊檔案後面
  • r+:讀寫模式,讀取檔案並寫入
  • w+:清空檔案內容,新寫入的東西可在讀出,若檔案不存在,會自行新建
  • a+:資料加到舊檔案後面,可讀取資料
  • b:讀取二進位檔模式
    中文常用的編碼格式為"utf-8",如果沒設定的話,檔案內若有中文,很容易出錯
    檔案的操作如下
# 開檔
放檔案的變數 = open( 檔案路徑 , mode = "開啟的模式" , encoding = "編碼格式" )

#讀取全部文字
變數 = 放檔案的變數.read()

#一行一行的讀取文字
for 變數 in 放檔案的變數:
	將文字從 放檔案的變數 一行一行的放入 變數 中
    
#寫入檔案
放檔案的變數.write(字串)

#關閉檔案
放檔案的變數.close()

而上面這種寫法雖然沒有問題,但缺點就是必須手動加入關閉檔案的程式碼,不是很方便,也很容易忘記,除了以上的方法,比較常見的是with關鍵字,在程式中對於檔案和資源的管理是非常重要的,開啟外部的檔案要是沒有被關閉,它就會一直佔據著記憶體,而with關鍵字可讓我們更容易管理這些開啟的資源,在with區塊之下,python 程式會自動進行資源的建立、清理與回收動作,這樣的好處是with區塊執行完畢會自動安全的關閉檔案,with不僅可以用來開檔,也能用來開網頁,使用方式如下

with open( 檔案路徑 , mode = "開啟的模式" , encoding = "編碼格式" ) as 變數:
	讀取或寫檔的程式區塊
	此區塊執行完畢會自動的關閉檔案

例外處理 try...except...

將可能會出錯的程式碼放在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:
    無論如何最後都會執行

上一篇
#6 Python進階教學3
下一篇
#8 NumPy教學
系列文
終極大數據地獄24

尚未有邦友留言

立即登入留言