1. 程式人生 > >Python基礎9——檔案操作和異常處理

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等同的位置。