【python】错误、异常和文件---复习笔记
錯誤、異常和文件
1. 異常處理
錯誤指的是代碼有語法問題,無法解釋運行,必須改正后才能運行
如果代碼沒有語法問題,可以運行,但會出運行時的錯誤,例如除零錯誤,下標越界等問題,這種在運行期間檢測到的錯誤被稱為異常 ,出現(xiàn)了異常必須處理否則程序會終止執(zhí)行,用戶體驗會很差。Phthon支持程序員自己處理檢測到的異常。可以使用try-except語句進行異常的檢測和處理
1.1 try-except語句
語法:try:【代碼塊A】 #可能會出錯誤的代碼 ? 異常檢測except Exception1[ as e]: ? #異常處理【代碼塊1】 #異常處理代碼 ? ? ? except Exception2[ as e]: ? #異常處理【代碼塊2】 #異常處理代碼....except Exceptionn[ as e]: ? #異常處理【代碼塊n】 #異常處理代碼[else:] ? ? ? ? ? ? ? #可選,如果沒有引發(fā)異常會執(zhí)行處理語句 ? ? ? [finally:] ? ? ? ? ? ? #無論如何都要執(zhí)行的語句處理語句【后續(xù)語句】-
執(zhí)行流程:
-
1、首先執(zhí)行try中【代碼塊A】,如果出現(xiàn)異常,立即終止代碼執(zhí)行,轉(zhuǎn)而到except塊中進行異常處理
-
2、異常處理except模塊可以多個,從上往下匹配,如果能夠匹配成功,立即執(zhí)行相應的異常處理代碼塊,執(zhí)行完畢后,不在往下匹配,轉(zhuǎn)到3執(zhí)行
-
3、執(zhí)行異常處理完畢后,如果有finally字句則執(zhí)行finally字句,如果沒有則執(zhí)行【后續(xù)語句】
-
4、如果匹配不到異常,有finally則執(zhí)行finally,然后則拋出錯誤,終止程序執(zhí)行。
-
5、如果沒有異常,如果有else字句則執(zhí)行else字句,執(zhí)行完else后,有finally字句則執(zhí)行,沒有則執(zhí)行【后續(xù)語句】
-
-
注意事項:
-
except匹配順序從上到下
-
except語句書寫要求:精確的類型往前放,模糊的,不精確的往后放
-
except不帶任何類型,則匹配所有類型異常,應該放到最后,吞掉異常
-
可以將多種異常用元組的方式(異常類型1,異常類型2...異常類型n)書寫,簡化代碼
-
except字句中e,是一個對象,打印它,會顯示異常信息描述
-
try-except也可以捕獲方法或函數(shù)中拋出的異常
-
所有異常類型都繼承自BaseException,使用BaseException可以將異常一網(wǎng)打盡
-
finally字句中可以進行一些清理工作,比如關閉文件,數(shù)據(jù)庫等工作
-
1.3 拋出異常
手動拋出一個指定類型的異常,無論是哪種異常類都可以帶一個字符串參數(shù),對異常進行描述。
-
raise不帶參數(shù)會把錯誤原樣拋出
1.4 異常嵌套
在try塊和excep塊中還可以分別再嵌套try-except塊
1.5 assert斷言
語法:assert 條件 [,異常描述字符串]
執(zhí)行流程:如果條件為假,則拋出AssertionError,條件為真,就當assert不存在
作用:對于可能出問題的代碼,加上斷言,方便問題排查
print('start') num = int(input('請輸入一個1~9的整數(shù):')) assert 0 <num <=9,'num不在1~9' print('end')1.6 自定義異常類
如果系統(tǒng)異常類型滿足不了業(yè)務需求,那么可以自己定義異常類來處理。
-
自己定義的異常類必須繼承BaseException或Exception
-
步驟:
-
在自定義異常類的構造函數(shù)中,調(diào)用父類構造函數(shù)
-
重寫__str__方法輸出異常信息
-
編寫異常處理方法處理異常
-
?
2. 文件處理
文件的處理包括讀文件和寫文件,讀寫文件就是請求操作系統(tǒng)打開一個文件對象,然后,通過操作系統(tǒng)提供的接口從這個文件對象中讀取數(shù)據(jù)(讀文件),或者把數(shù)據(jù)寫入這個文件對象(寫文件)。
2.1 文件讀取
文件讀取可分為以下步驟:
-
打開文件
-
讀取文件內(nèi)容
-
關閉文件
打開文件要使用open內(nèi)建函數(shù):
open(file [, mode='r', encoding=None, errors=None])
參數(shù)說明: file:文件路徑,可以是相對路徑和絕對路徑
mode:文件打開模式
encodeing: 文件編碼方式,不用于二進制文件,一般是utf-8,gbk
errors:指定如何處理編碼和解碼錯誤 ,適用于文本文件
返回值:一個可迭代的文件對象
| r | 只讀 |
| w | 只寫,寫之前會清空文件的內(nèi)容,如果文件不存在,會創(chuàng)建新文件 |
| a | 追加的方式,在原本內(nèi)容中繼續(xù)寫,如果文件不存在,則會創(chuàng)建新文件 |
| r+ | 可讀可寫 |
| w+ | 打開一個文件用于讀寫。如果該文件已存在則將其覆蓋。如果該文件不存在,創(chuàng)建新文件。 |
| a+ | 打開一個文件用于讀寫。如果該文件已存在,文件指針將會放在文件的結尾。文件打開時會是追加模式。如果該文件不存在,創(chuàng)建新文件用于讀寫。 |
| b | rb、wb、ab、rb+、wb+、ab+意義和上面一樣,用于二進制文件操作 |
注意:二進制文件一般用于視頻、音頻、圖片
讀取文件常用函數(shù):
| read([size]) | 讀取文件(讀取size字符,默認讀取全部) |
| readline([size]) | 讀取一行,如果指定size,將讀入指定的字符數(shù) |
| readlines() | 把文件內(nèi)容按行全部讀入,返回一個包含所有行的列表 |
2.2 寫文件
path = "file11.txt" ? #1.打開文件 f = open(path,"w",encoding="utf-8") ? #2.寫入內(nèi)容,將內(nèi)容寫入到緩沖區(qū) #不會自動換行,需要換行的話,需要在字符串末尾添加換行符 f.write("Whatever is worth doing is worth doing well該行很驕傲很關鍵\n") ? ? #3.刷新緩沖區(qū)【加速數(shù)據(jù)的流動,保證緩沖區(qū)的流暢】 f.flush() ? #4.關閉文件 關閉文件也會刷新緩沖區(qū) f.close() ? #簡寫方式:可以不用手動調(diào)用close with open(path,"w",encoding="utf-8") as f1:f.write("Whatever is worth doing is worth doing well該行很驕傲很關鍵")?
2.3 移動文件指針
文件是順序向后讀寫的,如果想要移動文件指針,可以使用seek方法:
file_obj.seek(offset,whence=0)
功能:移動文件指針
參數(shù):offset 是偏移量,正數(shù)表示從文件開頭向文件末尾移動,負數(shù)相反。
whence : 文件指針的位置,可選參數(shù),值可以是
SEEK_SET or 0 表示文件開頭位置,是默認值
SEEK_CUR or 1 表示當前位置(不能使用)
SEEK_END or 2 文件末尾位置(不能使用)
返回值:無
#1.txt內(nèi)容:hello world with open('1.txt','r',encoding='utf-8') as fp:fp.seek(5) #移動到hello后的空格位置print(fp.read(3)) #wofp.seek(0) ? #移動到開頭print(fp.read(5)) #helloprint(fp.tell()) ? #tell()顯示當前指針位置3.CSV文件操作
逗號分隔值(Comma-Separated Values,CSV),其文件以純文本形式存儲表格數(shù)據(jù)(數(shù)字和文本),文件的每一行都是一個數(shù)據(jù)記錄。每個記錄由一個或多個字段組成,用逗號分隔。使用逗號作為字段分隔符是此文件格式的名稱的來源,因為分隔字符也可以不是逗號,有時也稱為字符分隔值。
在Windows下,csv文件可以通過記事本,excel,notepad++,editplus等打開
-
作用:CSV廣泛用于不同體系結構的應用程序之間交換數(shù)據(jù)表格信息,解決不兼容數(shù)據(jù)格式的互通問題。
-
需要導入csv模塊
3.1 讀取csv
import csv with open(r'csv\winequality-red.csv') as fp: #1.打開文件#delimiter指定分隔符csv_reader = csv.reader(fp,delimiter=';') #2.獲取csv讀取器header = next(csv_reader) #獲取第一行的標題print(header)for line in csv_reader: #3.遍歷所有的行print(line)3.2 寫入csv
import csv l1 = [[1,2,3],[4,5,6],[7,8,9]] #打開文件時,要添加newline=''參數(shù),否則會多一個空行 with open('1.csv','w',newline='') as fp: #1.打開文件#delimiter='\t'指定數(shù)據(jù)分隔符csv_writer = csv.writer(fp,delimiter='\t') #2.獲取writerfor line in l1:csv_writer.writerow(line) #3.寫入文件總結
以上是生活随笔為你收集整理的【python】错误、异常和文件---复习笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 格雷码的FPGA实现
- 下一篇: 异常检测算法之LOF