1. 程式人生 > 實用技巧 >python學習六檔案操作和異常處理

python學習六檔案操作和異常處理

1.檔案的定義和型別

什麼是檔案呢?
  1. 檔案是資料的抽象和集合
  2. 檔案是儲存在輔助儲存器上的資料序列
  3. 檔案是儲存的一種
檔案有哪些型別呢?
  1. 本質上所有檔案以二進位制儲存,不過又可以分為文字檔案和二進位制檔案
  2. 文字檔案時由單一特定編碼組成,如UTF-8編碼用於txt、py檔案
  3. 二進位制檔案直接由位元0和1組成,沒有統一的字元編碼,如png圖片檔案,avi視訊檔案

2.檔案處理步驟

檔案處理可以分為三大步:

  1. 檔案的開啟

  2. 檔案的具體操作

  3. 檔案的關閉

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.檔案的操作

檔案操作分為:讀檔案、寫檔案。

讀檔案:

讀檔案有三種操作方式,分別是:

  1. file.read(size)

    1. 讀入全部內容,預設size=-1,如果size=n則讀入前size長度
  2. file.readline(size)

    1. 讀入一行內容,預設size=-1,如果給出引數,則讀入該行前size長度的內容
  3. file.readlines(hint)

    1. 讀入檔案所有行,以每行為元素形成列表,預設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 使用者程式碼生成的警告