Cris 的Python筆記(十三):異常和檔案處理
阿新 • • 發佈:2018-11-19
文章目錄
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')