Python基礎9——檔案操作和異常處理
1、Python中的編碼:
ASCII 、 Unicode 、utf-8 、gbk
對於計算機來說,計算機只認識0 1字元
(1)ASCII
8位二進位制編碼,理論上可以存256個字元,但是在ASCII表上只有127個字元,因為英文字身就簡單,每個字元一個位元組(8bit=1byte)
(2)gbk、gb2312
漢字,常用的有5000個,算上簡體繁體啥的,有2萬多個
GB2312是GBK的前身,可以識別6000個漢字,同時相容ASCII碼錶
隨著時代發展GB2312不能滿足我們的要求,比如少數民族漢字也需要編碼。
GBK出現,包括了GB2312的所有內容,增加了近20000個新的漢字(包含繁體字)。
然後又出現了GB18030,這種編碼將中國幾乎所有的字元都收錄了。
最常用的還是GBK。
GBK每個字元兩個位元組
(3)Unicode
各國都在將自己語言文字編碼,ISO組織看不下去了,Unicode就應運而生了。
Unicode又叫萬國碼,幾乎收錄了世界各國的字元,每個字元佔兩個位元組,0-65535。
(4)utf-8
uniconde是一個字符集,收錄所有字元,並沒有儲存情況,因為不管是什麼字元都是佔2個位元組。
為了解決儲存的問題,使用utf-8,在utf-8中,英文只佔一個位元組,但是漢子需要三個位元組
注意在Python3中,所有的字串都是Unicode,其他資料型別都是utf-8,Windows編碼是gbk
decode():解碼,將其他型別轉換成Unicode
encode():編碼,將Unicode編碼成其他型別
>>> s = '中文'
>>> b = s.encode('utf-8')
>>> b
b'\xe4\xb8\xad\xe6\x96\x87'
>>> c = s.encode('gbk')
>>> c
b'\xd6\xd0\xce\xc4'
>>> b.decode()
'中文'
>>> d = s.encode('utf8').decode('utf8' )
>>> d
'中文'
注意下面,編解碼時都不能越過Unicode這個中間碼
9.2操作檔案:建立,開啟,修改檔案
1、開啟檔案
(1)open:
open(file,[option])
file 是要開啟的檔案
option是可選擇的引數,常見有mode encoding
f = open('test.txt','w')
f.write('python 是最好的語言') #寫入內容,儲存在快取裡
f.flush() #將快取的寫入磁碟,檔案是在磁盤裡面,也就是flush以後寫入的內容才會寫進檔案
(2)with形式
讀完會自動關閉檔案
with open('name','mode') as f:
f.read()
f.write()
2、檔案的開啟模式
r :只讀模式,檔案不存在會報錯
w :寫入模式,檔案存在會清空之前的內容,檔案不存在則會建立新檔案
x:寫入模式,檔案存在會報錯,檔案不存在則會新建檔案
a :追加寫入模式,不清空之前的檔案,直接將寫入的內容新增到後面。
b:以二進位制模式讀寫檔案,wb,rb,ab。
+:可讀寫模式,r+,w+,x+,a+,這幾種模式還遵循了r,w,x,a的基本原則。
3、檔案的讀取
read 、 readable 、readline 、readlines
(1)f.read(size)
讀取檔案內容,內容以字串的形式返回。
size是可選的數值,指定字串的長度,如果沒有指定size或者指定為負數,就會讀取並返回整個檔案。 預設size=-1。
(2)f.readline()
一次從檔案中讀取一行
(3)f.readlines()
一次讀取所有行,返回列表,列表中每個元素為檔案中每行的資料。
f.read()
f.read(2)
f.readline()
f.readlines()
4、檔案的寫入
(1)f.write()
將要寫入的內容以字串的形式寫入檔案。
(2)f.writelines()
將要寫入的內容以字串組成的序列形式寫入檔案。
5、檔案的儲存和關閉
(1)f.flush()
因為利用write函式,內容只是寫進了快取中,但是檔案是在磁碟中儲存的,所以flush的作用就是將寫入的內容從快取中讀出並寫入磁碟中。
(2)f.close()
關閉檔案
6、游標位置
(1)read函式:其實讀檔案的時候就是按照游標為位置游標的移動來讀的。
(2)f.seek(offset,from)
移動游標,offset表示要將游標移動到什麼位置,from表示起始位置,0代表檔案開頭,1代表當前位置,2代表檔案末尾,注意這裡是移動的位元組數,對於Unicode每個字元佔兩個位元組。
(3)f.tell()
查詢當前游標所處的位置。
7、檢視檔案資訊
(1)closed 檢視檔案是否關閉,返回布林值
(2)mode 檢視檔案開啟模式
(3)name 檢視檔名
9.3異常處理
1、try
Python用異常物件來表示異常情況。遇到錯誤後,會引發異常。如果異常物件並未被處理或者捕捉,程式就會用所謂的回溯中止執行。
其實,每個異常都是一些類的例項,這些例項可以被引發,並且可以用很多種方法進行捕捉,使得程式可以捉住錯誤並且對其進行處理,而不是讓整個程式失效。
try: #除錯語句塊
測試語句塊
except exception1:#except後面跟可能會出錯的錯誤型別
語句塊(上面測試語句塊出現exception1錯誤時會執行這裡)
except (exception2,exception3): #try可以有多個except塊,而且except可以同時捕捉多個異常
語句塊
except exception4 as e: #把異常的原因賦值給e,往往在下面可以將e打印出來看結果,e就是異常物件本身
語句塊
except: #可以不加任何的錯誤類,這樣捕捉到任何錯誤都會引發這個
語句塊
else: #沒有異常發生時用執行這個
語句塊
finally: #不管有沒有異常都會執行這個
語句塊
對於異常來說,try是必須的,剩下的except,else,finally都是可選的,但是至少有一個,要不try的存在也就沒有意義了。所有的異常類都繼承自BaseException類。
注意:如果父類丟擲異常,子類不會再獲取了。
try:
fun()
except Exception as e:
raise Exception
except ImportError as e: #把ImportError放在Exception放在上面還是可以的,放下面就不會再觸發這個異常了
raise ImportError
finally:
pass
The class hierarchy for built-in exceptions is:
BaseException
+-- SystemExit
+-- KeyboardInterrupt
+-- GeneratorExit
+-- Exception
+-- StopIteration
+-- StopAsyncIteration
+-- ArithmeticError
| +-- FloatingPointError
| +-- OverflowError
| +-- ZeroDivisionError
+-- AssertionError
+-- AttributeError
+-- BufferError
+-- EOFError
+-- ImportError
+-- ModuleNotFoundError
+-- LookupError
| +-- IndexError
| +-- KeyError
+-- MemoryError
+-- NameError
| +-- UnboundLocalError
+-- OSError
| +-- BlockingIOError
| +-- ChildProcessError
| +-- ConnectionError
| | +-- BrokenPipeError
| | +-- ConnectionAbortedError
| | +-- ConnectionRefusedError
| | +-- ConnectionResetError
| +-- FileExistsError
| +-- FileNotFoundError
| +-- InterruptedError
| +-- IsADirectoryError
| +-- NotADirectoryError
| +-- PermissionError
| +-- ProcessLookupError
| +-- TimeoutError
+-- ReferenceError
+-- RuntimeError
| +-- NotImplementedError
| +-- RecursionError
+-- SyntaxError
| +-- IndentationError
| +-- TabError
+-- SystemError
+-- TypeError
+-- ValueError
| +-- UnicodeError
| +-- UnicodeDecodeError
| +-- UnicodeEncodeError
| +-- UnicodeTranslateError
+-- Warning
+-- DeprecationWarning
+-- PendingDeprecationWarning
+-- RuntimeWarning
+-- SyntaxWarning
+-- UserWarning
+-- FutureWarning
+-- ImportWarning
+-- UnicodeWarning
+-- BytesWarning
+-- ResourceWarning
2、assert 斷言
def asse(n):
assert n!=0,'n是零' #n!=0條件為True正常執行程式碼,False執行後面的程式碼
return 10/n
>>> asse(0)
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
asse(0)
File "C:/Users/dudan/Desktop/1.py", line 2, in asse
assert n!=0,'n是零' #n!=0條件為True正常執行程式碼,False執行後面的程式碼
AssertionError: n是零
>>> asse(-1)
-10.0
主要用assert在程式中置入檢查點,基本使用和if很像,但是斷言主要用於程式碼的除錯,
3、raise 丟擲異常
def ff(n):
if n>1:
raise Exception('你不能大於1',n)
>>> ff(2)
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
ff(2)
File "C:/Users/dudan/Desktop/1.py", line 3, in ff
raise Exception('你不能大於1',n)
Exception: ('你不能大於1', 2)
raise放在結束位置,捕捉到錯誤會,而assert放在和if等同的位置。