python學習六檔案操作和異常處理
1.檔案的定義和型別
什麼是檔案呢?
- 檔案是資料的抽象和集合
- 檔案是儲存在輔助儲存器上的資料序列
- 檔案是儲存的一種
檔案有哪些型別呢?
- 本質上所有檔案以二進位制儲存,不過又可以分為文字檔案和二進位制檔案
- 文字檔案時由單一特定編碼組成,如UTF-8編碼用於txt、py檔案
- 二進位制檔案直接由位元0和1組成,沒有統一的字元編碼,如png圖片檔案,avi視訊檔案
2.檔案處理步驟
檔案處理可以分為三大步:
-
檔案的開啟
-
檔案的具體操作
-
檔案的關閉
3.檔案的開啟和關閉
檔案開啟有兩種方式:
1.直接採用open(檔名稱)開啟
fileName = open('test1.txt') #注意:檔名稱可以是檔案相對與當前程式的路徑,稱為相對路徑; #也可以是檔案相對於電腦的路徑,稱為絕對路徑。
2.採用with… as… 開啟
filename = 'test1' with open(filename) as f: #檔案操作程式碼
檔案的關閉:
檔案開啟後必須關閉檔案。不過在python解析器中,當程式關後會自動關閉檔案。
檔案關閉語法 變數名.close()
fileName = open('test1.txt') #檔案操作程式碼 filename.close()
需要注意的是,採用with…as…方式開啟的檔案就不用我們在寫關閉檔案的程式碼。with…as…會自動在檔案操作程式碼執行完成後關閉檔案。
4.檔案的操作
檔案操作分為:讀檔案、寫檔案。
讀檔案:
讀檔案有三種操作方式,分別是:
-
file.read(size)
- 讀入全部內容,預設size=-1,如果size=n則讀入前size長度
-
file.readline(size)
- 讀入一行內容,預設size=-1,如果給出引數,則讀入該行前size長度的內容
-
file.readlines(hint)
- 讀入檔案所有行,以每行為元素形成列表,預設hibt=-1,如果給出引數,則讀入前hint行
寫檔案:
有兩種操作方式外加一種輔助操作:
1.file.write(s)
向檔案協議一個字串或位元組流
f.write('中國是一個偉大的國家!')
2.file.writeline(lines)
將一個元素全位字串的列表寫入檔案,字串拼接後寫入
ls = ['中國', '法國', '美國'] f.write(ls) #中國法國美國
3.file.seek(offset)
改變當前檔案操作指標的位置,offset含義如下:
0-檔案開頭;1-當前位置;2-檔案結尾
f.seel(0)#回到檔案開頭 f.seel(1)#檔案當前位置 f.seel(2)#回到檔案結尾
檔案寫入和讀取:
fo = opne('test1.txt', 'w+') ls = ['中國', '法國', '美國'] fo.writelines(ls) fo.seek(0) for line in fo: print(line) fo.close()
檔案開啟模式:
fileName = open('test1.txt') #預設使用文字形式和只讀模式開啟檔案 fileName = open('test1.txt', 'rt')#文字制度模式開啟檔案 fileName = open('test1.txt', 'w')#文字形式,覆蓋寫模式開啟問及那
fileName = open('test1.txt', 'a+')#文字形式,追加寫模式+讀檔案
fileName = open('test1.txt', 'x')#文字形式、建立寫模式
fileName = open('test1.txt', 'b')#二進位制形式,只讀模式
fileName = open('test1.txt', 'wb')#二進位制形式,覆蓋寫模式 fileName.close()
檔案的全文字操作:
方法一:
fname = input('請輸入要開啟檔案的名稱:') fo = open(fname, 'r') txt = fo.read() #對全文字txt進行處理 fo.close() # 一次讀入,統一處理,文字檔案內容大消耗大
方法二:
fname = input('請輸入要開啟檔案的名稱:') fo = open(fname, 'r') txt = fo.read(2) while txt != '': #對txt進行處理 txt = fo.read(2) fo.close() # 分階段,按數量讀入,逐步處理 處理大檔案更加可行有效
分行儲存的檔案讀寫:逐行遍歷檔案
fname = input('請輸入要開啟檔案的名稱:') fo = open(fname, 'r') for line in fo.readlines() print(line) fo.close()
5.異常處理
異常:在程式執行過程中,不可避免的出現一些錯誤 例如用沒賦值的變數等。Python使用被稱為異常的特殊物件來管理程式執行期間發生的錯誤。每當發生錯誤時,它都會建立一個異常物件,若編寫了處理該異常的程式碼,程式將繼續執行,
否則程式將停止,並顯示一個traceback其中包含有關異常的報告。
異常處理語法:若try程式碼塊中的程式碼執行起來沒有問題,python將跳過except程式碼塊;否則python將查詢except程式碼塊,並進行處理。而依賴於try程式碼塊成功執行的程式碼都放在else程式碼塊中。
如果出現錯誤時,對錯誤不進行任何處理,可使用pass語句,pass還充當了佔位符,提醒你程式的某個地方還什麼都沒做,以後也許要新增些程式碼常見異常如: FileNotFoundError, ZeroDivisionError,ValueError。無法確定異常型別時,就用except Exception,可以捕獲所有異常。
try的工作原理是,當開始一個try語句後,python就在當前程式的上下文中作標記,這樣當異常出現時就可以回到這裡,try子句先執行,接下來會發生什麼依賴於執行時是否出現異常。
- 如果當try後的語句執行時發生異常,python就跳回到try並執行第一個匹配該異常的except子句,異常處理完畢,控制流就通過整個try語句(除非在處理異常時又引發新的異常)。
- 如果在try後的語句裡發生了異常,卻沒有匹配的except子句,異常將被遞交到上層的try,或者到程式的最上層(這樣將結束程式,並列印預設的出錯資訊)。
- 如果在try子句執行時沒有發生異常,python將執行else語句後的語句(如果有else的話),然後控制流通過整個try語句。
try: #可能出現異常的程式碼塊 except: #出現異常後執行的程式碼塊
else:
#若try模組沒問題,會執行的程式碼塊 finally: #不管有沒有異常都會執行的程式碼塊
raise: #用於引發一個實際的異常,raise 可以單獨作為語句使用,引發一個具體的異常物件;
除了處理實際的錯誤條件之外,對於異常還有許多其它的用處。在標準 Python 庫中
一個普通的用法就是試著匯入一個模組,然後檢查是否它能使用。匯入一個並不存在的
模組將引發一個 ImportError 異常。
try: 正常的操作 ...................... except(Exception1[, Exception2[,...ExceptionN]]]): 發生以上多個異常中的一個,執行這塊程式碼 ...................... else: 如果沒有異常執行這塊程式碼
print('異常出現前') try: print(a) print(10/0) except Exception as e: #except後面如果跟異常物件則預設捕獲所有異常 #由於Exception是所有異常物件的父物件所以except後面跟Exception捕獲所有異常 print(e,type(e)) else: print('yi') finally: print('無論是否出現異常,finally都會執行')
異常的引數:一個異常可以帶上引數,可作為輸出的異常資訊引數。
可以通過except語句來捕獲異常的引數,如下所示:
try: 正常的操作 ...................... except ExceptionType, Argument: 你可以在這輸出 Argument 的值...
變數接收的異常值通常包含在異常的語句中。在元組的表單中變數可以接收一個或者多個值。
元組通常包含錯誤字串,錯誤數字,錯誤位置。
丟擲(觸發)異常:可以使用raise語句自己觸發異常
raise [Exception [, args [, traceback]]] #語句中 Exception 是異常的型別(例如,NameError)引數標準異常中任一種,args 是自已提供的異常引數。 #最後一個引數是可選的(在實踐中很少使用),如果存在,是跟蹤異常物件。
#IndexError #NameError class AgeError(ValueError): pass age = 1000 if 0 < age < 150: print('age legal') else: raise AgeError('age error')
#!/usr/bin/python # -*- coding: UTF-8 -*- try: fh = open("testfile", "w") fh.write("這是一個測試檔案,用於測試異常!!") except IOError: print "Error: 沒有找到檔案或讀取檔案失敗" else: print "內容寫入檔案成功" fh.close() #輸出結果 $ python test.py 內容寫入檔案成功 $ cat testfile # 檢視寫入的內容 這是一個測試檔案,用於測試異常!!
使用者自定義異常:
通過建立一個新的異常類,程式可以命名它們自己的異常。異常應該是典型的繼承自Exception類,通過直接或間接的方式。
以下為與RuntimeError相關的例項,例項中建立了一個類,基類為RuntimeError,用於在異常觸發時輸出更多的資訊。
在try語句塊中,使用者自定義的異常後執行except塊語句,變數 e 是用於建立Networkerror類的例項。
class Networkerror(RuntimeError): def __init__(self, arg): self.args = arg
定義以上類後,可以觸發該異常,如下所示:
try: raise Networkerror("Bad hostname") except Networkerror,e: print e.args
python標準異常:
異常名稱 | 描述 |
---|---|
BaseException | 所有異常的基類 |
SystemExit | 直譯器請求退出 |
KeyboardInterrupt | 使用者中斷執行(通常是輸入^C) |
Exception | 常規錯誤的基類 |
StopIteration | 迭代器沒有更多的值 |
GeneratorExit | 生成器(generator)發生異常來通知退出 |
StandardError | 所有的內建標準異常的基類 |
ArithmeticError | 所有數值計算錯誤的基類 |
FloatingPointError | 浮點計算錯誤 |
OverflowError | 數值運算超出最大限制 |
ZeroDivisionError | 除(或取模)零 (所有資料型別) |
AssertionError | 斷言語句失敗 |
AttributeError | 物件沒有這個屬性 |
EOFError | 沒有內建輸入,到達EOF 標記 |
EnvironmentError | 作業系統錯誤的基類 |
IOError | 輸入/輸出操作失敗 |
OSError | 作業系統錯誤 |
WindowsError | 系統呼叫失敗 |
ImportError | 匯入模組/物件失敗 |
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 | 使用者程式碼生成的警告 |