【head First python】之文件與異常處理
上一章我們談到如何處理嵌套列表中的數據,這一節將講到如何處理來自文件中的數據及異常處理辦法。
python是如何處理文件的?
Demo:
file = open('sketch.txt')#使用open函數打開文件並賦值給file print(file.readline())#讀文件第一行數據 print(file.readline())#讀文件第二行數據 file.seek(0)#回到文件第一行 print(file.readline())#再讀第一行 file.close()#關閉文件,使python不再調用
這裏就拿附件中的文件做操作,下面是針對該文件邏輯特點寫的代碼
Demo:
import os a = os.getcwd() print(a) #打印出當前工作目錄 os.chdir('C:\\Users\\haohu\Desktop')#修改當前工作目錄 a = os.getcwd() print(a) #再打印出當前工作目錄,文件要放在工作目錄中! if os.path.exists('sketch.txt'):#判斷文件是否存在 f = open('sketch.txt') for i in f: if i.find(':') != -1:#判斷是否具備分割條件,這裏爲是否有:做爲條件 (role, line) = i.split(':',1)#使用split函數並且將:前後分別賦值,,且只切割1個: print(role,end='')#打印:前的內容 print('|||',end='')#萬惡的分割線 print(line,end='')#打印:後的內容 f.close() else: print('未發現sketch.txt文件')
從上面例子可以看到除了open還多了很多處理該文件的邏輯條件,如split,find,os.path.exists等,看起來是否很複雜,如果該文件中的數據更多,或許需要添加更多的代碼去處理這些特定邏輯,否則就等着debug!!
現在,我們就可以使用try/except的方式來處理這些不確定的邏輯條件!
Demo:
try: 可能藏有錯誤邏輯的代碼 except: 自定義的恢復錯誤代碼
看起來是不是很酷?讓我們改進一下代碼!
Demo:
import os a = os.getcwd() print(a) #打印出當前工作目錄 os.chdir('C:\\Users\\haohu\Desktop')#修改當前工作目錄 a = os.getcwd() print(a) #再打印出當前工作目錄,文件要放在工作目錄中! try: f = open('sketch.txt') for i in f: try: (role, line) = i.split(':',1)#使用split函數並且將:前後分別賦值,,且只切割1個: print(role,end='')#打印:前的內容 print('|||',end='')#萬惡的分割線 print(line,end='')#打印:後的內容 except ValueError: #錯誤類型爲Value print('error') f.close() except IOError: #錯誤類型爲IO print('未發現sketch.txt文件')
是不是很棒?不僅不需要在代碼中添加不是必要的處理邏輯與代碼,而且可以看到使用try/except可以自己定義錯誤類型與錯誤提示代碼,%100的調試利器!
小結:
一:open()函數可以打開一個文件,並創建一個迭代器從文件讀取數據,一次讀取一個數據行。
二:readline()方法從一個打開的文件讀取一行數據。
三:seek()方法可以用來將文件"退回"至起始位置
四:close()方法關閉open()打開的文件
五:split()方法可以將一個字符串根據相應的條件分解爲幾段
六:ValueError錯誤類型爲數據不符合期望的格式時出現
七:IOError爲無法正常訪問文件時出現
八:find()方法會在一個字符串中查找一個指定的項,如果查不到則返回-1
九:可以在except:下面寫pass,大概等同null或空,也就是當錯誤發生時忽略,什麼也不做!