1. 程式人生 > >Cris 的Python筆記(十三):異常和檔案處理

Cris 的Python筆記(十三):異常和檔案處理

文章目錄

1. Python 是如何處理異常的?

'''
    Python 如何處理異常的?
    最簡單的方式如下
    try:
        程式碼塊(將可能出錯的程式碼放入到 try 中)
    except:
        程式碼塊(try 出錯就執行)
    else:
        程式碼塊(try 沒有出錯執行)
'''
try: a = 1 / 0 except Exception as e: print("出錯了!!!") else: print('沒有出錯!') ''' 異常傳播 函式中出現異常,如果對異常進行了處理,那麼異常不會進行向上傳遞,否則就一直傳遞到呼叫該函式的地方,如果還是沒有處理異常就一直一直往上傳遞,直至主模組(__main__) ''' def function(): print('cris') 10 / 0 # except 後面的異常型別決定將要捕獲的異常型別,並執行 except 語句塊的程式碼 try: function(
) except Exception as e: print('➗') else: pass # 最完整異常處理語法: try 語句必須,else語句可選,except 和 finally 至少有一個 try: 1 / 0 except Exception as e: print('error') else: pass finally: print('james') # 自定義異常以及丟擲異常(raise) class myError(Exception): pass def add(a: int, b: int)->int
: if a < 0 or b < 0: raise myError("引數不能為負數") else: return a + b print(add(1, 2)) # 3 print(add(1, -1))

2. Python 中常用的檔案處理語法(重點)

'''
1. 開啟檔案
open 函式
open(檔名,[...]): 檔名可以是相對路徑,也可以是絕對路徑(windows 可以使用/代替\,或者使用 \\,或者使用 r'\' 原始字串忽略所有轉義字元);../ 表示上級目錄

2. 關閉檔案
檔案物件.close() / with open(file_name) as file_obj 語句可以自動關閉檔案流

3. 檔案型別:純文字檔案和二進位制檔案,open方法開啟檔案預設以文字模式開啟檔案
編碼格式:預設 gbk,建議設定為 utf-8(encoding='utf - 8')

4. 操作檔案
檔案物件.read():讀取文字所有內容為字串,對於大檔案不要使用這個方法
檔案物件.readLine():單行讀取文字內容
檔案物件.readlines():一次性將讀取到的文字封裝為一個列表返回,每個元素就是讀取到的每行文字資料

5. 檔案的迭代讀取:
    while 迴圈
    for line in file_obj

6. 向檔案寫入內容
檔案物件.write(字串)
'''

# file_name = "demo.txt"
# file_obj = open(file_name)
# print(file_obj)   # <_io.TextIOWrapper name='demo.txt' mode='r' encoding='cp936'>

# content = file_obj.read()
# file_obj.close()
# print(content)

# 可以自動關閉檔案以及捕獲異常
'''
try:
    with open(file_name, encoding='utf - 8') as file_obj:
        # size 引數可以用來指定讀取的字元數量(預設讀取模式下 't'),預設是-1,如果讀取到文字末尾,返回空字串
        content = file_obj.read(3)
        print(content)
        # 還可以使用 len 函式計算讀取的文字內容的字元數(包括換行符)
        print(len(content))
except Exception as e:
    raise e
'''

'''
try:
    with open(file_name, encoding='utf - 8') as file_obj:
        # while True:
        #     content = file_obj.readlines()
        #     if not content:  # 空字串可以視為False
        #         print('讀取完畢')
        #         break
        #     print(content)

        for x in file_obj:
            print(x)

except Exception as e:
    raise e
'''

# 使用 open 方法的時候最好指定檔案操作許可權,否則無法對檔案進行寫操作
# 在執行寫操作的時候,如果檔名不存在,將會自動建立該檔案
# r 表示只讀,w 表示可寫並覆蓋以前的內容,a 表示追加內容(檔案不存在,也會建立檔案)
# + 表示為操作符增加功能:r+ 表示可讀寫(檔案不存在則報錯),w+ 表示可獨寫(檔案不存在則報錯),a+ 表示可讀追加(檔案不存在則報錯)
# x 用來新建檔案,檔案存在則報錯,不存在就建立,有寫的許可權但是沒有讀許可權
file_name = 'test.txt'
with open(file_name, 'w', encoding='utf-8') as file_obj:
    result = file_obj.write('hello,cris\n')
    # 表示總共寫入的字元的個數(包括換行符)
    print(result)
    file_obj.write('good morning!\n')

file_name = 'test1.txt'
with open(file_name, 'a', encoding='utf-8') as file_obj:
    file_obj.write('hehe,simida')

file_name = 'test2.txt'
with open(file_name, 'x', encoding='utf-8') as file_obj:
    file_obj.write("hehe")
    # content = file_obj.readline();
    # print(content)

3. Python 處理二進位制檔案

file_name = 'c:/users/zc-cris/Desktop/LinuxProbe.pdf'

'''
    讀取檔案的時候,有兩種模式:
    1. 't' 表示讀取文字檔案(預設),'r' 其實預設就是 'rt'
    2. 'b' 表示讀取二進位制檔案
    3. 讀取檔案千萬不要一次性讀取,效能非常差
    Python 中的檔案物件不用自己關閉流
'''
with open(file_name, 'rb') as file_obj:
    # 讀取文字檔案時,size 引數預設字元
    # 讀取二進位制檔案時,size 引數預設位元組
    # content = file_obj.read(100)
    # print(content)
    new_file_name = 'LinuxProbe.PDF'
    with open(new_file_name, 'wb') as new_file_obj:
        # 定義每次讀取的容量(單位位元組)
        buf = 1024 * 100
        while True:
            content = file_obj.read(buf)
            if content:
                new_file_obj.write(content)
            else:
                break

4. seek 和 tell 方法

# 文字檔案中,如果以二進位制模式讀取(read方法),一個英文字母以一個位元組儲存,一箇中文一般在 utf-8 編碼格式下是以三個位元組儲存,size 引數的單位就是位元組
# 如果以文字模式讀取(read方法),那麼 size 引數的單位就是字元

'''
    tell方法可以用於檢視當前讀取的位置/檔案指標的位置

    seek方法可以用來修改當前讀取的位置/檔案指標的位置,引數的單位為位元組,一般用來處理英文文字
    file_obj.seek(10)
    file_obj.seek(20,0)
    file_obj.seek(30,1)
    file_obj.seek(-2,2)
    第一個引數是指標移動的距離
    第二個引數表示指標的相對位置:0 表示從檔案頭開始計算,預設值;1 表示從上一次指標停下的位置開始計算;2 表示從檔案末尾開始計算,此時第一個引數一般都是負數,表示從後往前讀取的距離
'''
with open('test.txt', 'rb') as file_obj:
    content = file_obj.read(3)
    print('當前讀取到了---》', file_obj.tell())  # 3
    file_obj.seek(34)
    print('當前讀取到了---》', file_obj.tell())  # 34
    print(content)  # b'\xe7\xa8\x8b' (顯示中文)


'''
with open('test.txt','r',encoding='utf-8') as file_obj:
    content = file_obj.read(3)
    print(content)  # 程式猿
'''

5. 檔案操作之 os 包的常用 API

import os
from pprint import pprint
'''
# 1. 獲取當前檔案的目錄結構,引數預設是'.',可以設定為 '..' 表示上一級目錄
content = os.listdir()
pprint(content)  # 返回列表,每個元素就是指定目錄下的檔案

# 2. 獲取當前所在目錄
content = os.getcwd()
pprint(content)  # 'C:\\Users\\zc-cris\\Desktop\\Python學習日記\\語法學習\\五 異常和檔案處理'

# 3. 切換目錄,類似 cd ..
os.chdir('..')
content = os.getcwd()
pprint(content)  # 'C:\\Users\\zc-cris\\Desktop\\Python學習日記\\語法學習'

os.chdir('C:/')
content = os.getcwd()
pprint(content)  # 'C:\\'

'''
# 4. 當前資料夾下建立一個 123 的目錄
# os.mkdir("123")

# 5. 刪除目錄
# os.removedirs('123')

# 6. 建立檔案(許可權一定不能設定為 r 或者 r+)
# open('cris1.txt','w')
# open('cris2.txt','x')
# open('cris3.txt','r')

# 7. 刪除檔案
# os.remove('cris1.txt')

# 8. 重新命名檔案(第一個引數為原檔案路徑,第二個引數為新檔案路徑,如果新舊檔案處於同一目錄則重新命名,否則就是檔案剪下移動)
os.rename('cris.txt', 'new_cris.txt')