課堂筆記
1. 異常簡介
程序在運⾏過程中可能會出現⼀些錯誤。⽐如: 使⽤了不存在的索引,兩個不 同類型的數據相加…這些錯誤我們稱之爲異常
處理異常 程序運⾏時出現異常,⽬的並不是讓我們的程序直接終⽌!Python 是希望在出現異常時,我們可以編寫代碼來對異常進⾏處理
# 在程序運行過程當中,不可避免出現一些錯誤例如 用沒有賦值過的變量。類型不同做加法運算..
# 異常以後的代碼都不會執行
# print(a) # NameError: name 'a' is not defined
# print(10/0) # ZeroDivisionError: division by zero
# print('hello')
# print(10 / 0)
# print('python')
# 處理異常
# 程序運行時出現異常,目的並不是要終止我們的程序
# Python是希望出現異常時,我們可以編寫代碼來對異常進行處理
# try語句
# try:
# 代碼塊 (可能出現錯誤的語句)
# except 異常類型 as 異常名:
# 代碼塊 (出現錯誤之後的處理方式)
# except 異常類型 as 異常名:
# 代碼塊 (出現錯誤之後的處理方式)
# except 異常類型 as 異常名:
# 代碼塊 (出現錯誤之後的處理方式)
# .....
# finally:
# 代碼塊
# else:
# 代碼塊 (沒有出錯要執行的語句)
print('hello')
try:
print(10 / 2)
except:
print('出錯了兄弟.....')
else:
print('程序正常執行沒有錯誤')
print('python')
2. 異常的傳播
當在函數中出現異常時,如果在函數中對異常進⾏了處理,則異常不會在進 ⾏傳播。如果函數中沒有對異常進⾏處理,則異常會繼續向函數調⽤傳播。 如果函數調⽤處處理了異常,則不再傳播異常,如果沒有處理則繼續向調⽤ 處傳播。直到傳遞到全局作⽤域(主模塊)如果依然沒有處理,則程序終⽌,並 顯示異常信息。
當程序運⾏過程中出現異常以後,所有異常信息會保存到⼀個異常對象中。 ⽽異常傳播時,實際上就是異常對象拋給了調⽤處
# 異常的傳播
# 當在函數中出現異常時,如果在函數中處理了異常。則異常不會在繼續傳播
# 如果在函數中沒有處理異常,則異常會繼續向函數調用出傳播
# 如何函數調用處處理了異常,則不在傳播。如果沒有處理則繼續向調用處傳播
# 直到傳遞到全局作用域(主模塊)如果依然沒有處理,則呈現終止,並顯示異常信息
# 當程序運行過程中,出現異常以後,所以的異常信息會被保存到一個專門的異常對象當中
# 而異常傳播時,實際上就是異常對象拋給了調用處
# def fn():
#
# print('hello fn')
# print(10 / 0)
#
# try:
# fn()
#
# except:
# pass
def fn():
print('hello fn')
print(10 / 0)
def fn2():
print('hello fn2')
fn()
def fn3():
print('hello fn2')
fn2()
# fn3()
print(NameError)
--------------------------------------------------------------------------
print('異常出現前')
lst = []
try:
# print(a)
# lst + 'hello'
print(10/0)
# except NameError:
# # except後不跟任何內容,此時它會捕獲所有的異常
# # print('處理異常的邏輯....')
# print('出現 NameError異常了')
# except ZeroDivisionError:
# # except後不跟任何內容,此時它會捕獲所有的異常
# # print('處理異常的邏輯....')
# print('出現 ZeroDivisionError異常了')
except Exception as e:
# Exception 是有所有異常類的父類 所有如果except後跟Exception 它會捕獲到所有的異常
print('出現異常了',e,type(e))
finally:
print('無論是否出現異常,該語句都會執行')
print('異常出現後')
3. 異常對象
1 try語句
2 try:
3 代碼塊(可能出現錯誤的語句)
4 except 異常類型 as 異常名:
5 代碼塊(出現錯誤以後的處理⽅式)
6 except 異常類型 as 異常名:
7 代碼塊(出現錯誤以後的處理⽅式)
8 except 異常類型 as 異常名:
9 代碼塊(出現錯誤以後的處理⽅式)
10 ....
11 else:
12 代碼塊(沒出錯時要執⾏的語句)
13
14 finally:
15 代碼塊(是否出錯該代碼塊都會執⾏)
16 try是必須的 else有沒有都可以
17 except和finally⾄少有⼀個
18
4. ⽂件打開
⽂件(file) 通過Python程序來對計算機中的各種⽂件進⾏增刪改查的操作 ⽂ 件也叫I/O(Input/Output)
⽂件的操作步驟
打開⽂件
對⽂件進⾏各種操作(讀、寫)然後保存
關閉⽂件
⽂件會有⼀個返回值。返回⼀個對象,這個對象就表示的是當前的⽂件
# 文件(File)(IO Input/Output)
# 通過Python程序對計算機的各種文件進行增刪改查的操作
# 操作文件的步驟 1.打開文件 2.對文件進行各種操作(讀寫)然後保存 3.關閉文件
# open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
# 返回值 返回了一個對象 這個對象代表的就是當前打開的文件
# 如果目標文件和當前文件在同一級目錄下,直接使用文件名即可
file_name = 'demo.txt'
file_name = 'D:\JerryProject\基礎\demo.txt'
file_obj = open(file_name) # 打開對應的文件
print(file_obj)
-----------------------------------------------------------------------------
file_name = 'demo4.txt'
with open(file_name,'x',encoding='utf-8') as file_obj:
# write()來向文件中寫入內容
# 如果操作的是一個文本文件的時候,則需要傳遞一個字符串作爲參數
# r表示只讀
# w表示可以寫
# a表示追加
# x 表示用來創建新的文件,如有文件不存在則創建,如果存在就報錯
# FileExistsError: [Errno 17] File exists: 'demo.txt'
# file_obj.write('nice to meet you') # io.UnsupportedOperation: not writable
file_obj.write('abc\n')
file_obj.write('def')
file_obj.write('wxy')
r = file_obj.write(str(123)+'\n') # TypeError: write() argument must be str, not int
print(r)
---------------------------------------------------------------------------
file_name = 'demo.txt'
with open(file_name,encoding='utf-8') as file_obj:
# print(file_obj.read())
# readline()該方法用來讀取一行的內容
# print(file_obj.readline(),end='')
# print(file_obj.readline())
# print(file_obj.readline())
# readlines() 它會一次性讀取文件內容以列表形式返回
r = file_obj.readlines()
print(r[0])
-------------------------------------------------------------------------------
file_name = 'demo.txt'
try:
with open(file_name,encoding='utf-8') as file_obj:
# 定義一個變量 來保存結果
file_content = ''
# 定義一個變量 指定每次讀取的大小
chunk = 100
# 創建一個循環來讀取內容
while True:
content = file_obj.read(chunk)
# 檢查是否讀完文件
if not content:
# 內容讀取完畢退出循環
break
# print(content,end='')
file_content += content
except FileNotFoundError:
print(f'{file_name}文件不存在.....')
print(file_content,end='')
5. 關閉⽂件
調⽤close()⽅法來關閉⽂件
with…as 語句不⽤寫close()來關閉。它⾃帶關閉
# file_name = 'demo.txt'
# file_obj = open(file_name)
#
# # read()函數 用來讀取文件的內容,它會將內容全部保存到一個字符串返回
#
# content = file_obj.read()
#
# print(content)
#
# # 關閉文件
# # 調用close()函數來關閉文件
# file_obj.close()
# file_obj.read() # ValueError: I/O operation on closed file.
# with...as...語句 不用寫close()
file_name = 'demo.txt'
try:
with open(file_name) as file_obj:
print(file_obj.read())
except FileNotFoundError:
print(f'{file_name}文件不存在.....')
# print(file_obj.read()) ValueError: I/O operation on closed file.
6. 讀取⽂件
通過read()來讀取⽂件的內容
調⽤open()來打開⼀個⽂件,可以將⽂件分爲2中類型 ⼀種 純⽂本⽂件(使⽤utf-8編碼編寫的⽂件) ⼀種 ⼆進制⽂件(圖⽚ mp3 視頻…) open()打開⽂件時,默認是以⽂本⽂件的形式打開的 open()默認的編碼 爲None。所以處理⽂本⽂件時要指定編碼
# 調用open()函數打開一個文件時,可以將文件分爲2種類型
# 一種純文本
# 一種是二進制文件
file_name = 'demo2.txt'
try:
with open(file_name,encoding='utf-8') as file_obj:
# 對於較大的文件不要直接使用read()
# help(file_obj.read)
content = file_obj.read(6)
content = file_obj.read(6)
content = file_obj.read(6)
content = file_obj.read(6)
print(content)
print(len(content))
except FileNotFoundError:
print(f'{file_name}文件不存在.....')
7. 較⼤⽂件的讀取
通過read()讀取⽂件內容時會將⽂件中所有的內容全部讀取出來。如果對於 讀取的⽂件⽐較⼤的話。會⼀次性的將⽂件加載到內容中。容易導致內存泄 露。所以對於較⼤的⽂件。不要直接調⽤read()
read()可以接收⼀個size作爲的參數。該參數⽤來指定要讀取字符的數量。默 認值爲-1.-1也就是要讀取全部的內容 每次讀取都會從上次讀取到的位置開始。如果字符的數量⼩於size。則會讀 取所有的。如果讀取到最後的⽂件。則會返回空串
readline() 該⽅法⽤來讀取⼀⾏
readlines() 該⽅法⽤於⼀⾏⼀⾏的讀取內容,它會⼀次性將讀取到的內容封 裝到⼀個列表當中返回
8. ⽂件的寫⼊
write()來向⽂件中寫⼊內容
該⽅法可以分多次向⽂件寫⼊內容
寫⼊完成之後該⽅法會返回寫⼊的字符的個數
使⽤open()函數打開⽂件時,必須要指定打開⽂件要做的操作(讀、寫、追 加)。如果不指定操作類型,則默認是讀取⽂件,⽽讀取⽂件是不能向⽂件中 寫⼊
r 表示只讀
w表示可以寫。使⽤w寫⼊⽂件時,如果⽂件不存在則會創建⼀個⽂件。 如果⽂件存在則會覆蓋原⽂件內容
9. ⼆進制⽂件寫⼊
讀取⽂本⽂件時,size是以字符爲單位。讀取⼆進制⽂件時,size是以字節 爲單位
我們⽤wb來寫⼊⼆進制⽂件
10.csv文件的操作
#寫入
import csv
with open('test.csv','a', newline='',encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['4', '貓砂', '25', '1022', '886'])
writer.writerow(['5', '貓罐頭', '18', '2234', '3121'])
------------------------------------------------------------
#讀出
import csv
with open('test.csv', newline = '', encoding = 'utf-8') as f:
#參數encoding = 'utf-8'防止出現亂碼
reader=csv.reader(f)
for row in reader:
print(row)
我們也可以用這種方式自學:dir(x),可以查詢到x相關的函數,x可以是模塊,也可以是任意一種對象。
# 請直接運行並體驗代碼
a = '' # 設置一個字符串
print('字符串:')
print(dir(a)) # 把字符串相關的函數展示出來
a = [] # 設置一個列表
print('列表:')
print(dir(a)) # 把列表相關的函數展示出來
a = {} # 設置一個字典
print('字典:')
print(dir(a)) # 把字典相關的函數展示出來
11.random模塊/time模塊
import random # 調用random模塊
a = random.random() # 隨機從0-1之間(包括0不包括1)抽取一個小數
print(a)
a = random.randint(0,100) # 隨機從0-100(包括0和100)之間抽取一個數字
print(a)
a = random.choice('abcdefg') # 隨機從字符串,列表等對象中抽取一個元素(可能會重複)
print(a)
a = random.sample('abcdefg', 3) # 隨機從字符串,列表等對象中抽取多個不重複的元素
print(a)
items = [1, 2, 3, 4, 5, 6] # “隨機洗牌”,比如打亂列表
random.shuffle(items)
print(items)
--------------------------------------------------------------
# 請直接運行並體驗代碼
import random # 調用random模塊
print(dir(random))
--------------------------------------------------------
import time
print('第一句話,過兩秒出現第二句。')
time.sleep(2)
print('第二句話。')
===================================================
time模塊和random模塊是Python的系統內置模塊,也就是說Python安裝後就準備好了這些模塊供你使用。
此外,Python作爲一門膠水語言,一個強大的優勢就是它擁有許多第三方的模塊可以直接拿來使用。
如果是第三方編寫的模塊,我們需要先從Python的資源管理庫下載安裝相關的模塊文件。
下載安裝的方式是打開終端,Windows用戶輸入pip install + 模塊名;蘋果電腦輸入:pip3 install + 模塊名,點擊enter即可。(需要預裝python解釋器和pip)
比如說,爬蟲時我們會需要用到requests這個庫(庫是具有相關功能模塊的集合),就需要在終端輸入pip3 install requests(Mac用戶)的指令。
=====================================================
自編模塊的導入演示
story.py
sentence = '從前有坐山,'
def mountain():
print('山裏有座廟,')
class Temple:
sentence = '廟裏有個老和尚,'
def reading(self):
print('在講一個長長的故事。')
------------------------------------------------------------------------------------
main.py
import story
if __name__ == '__main__':
print(story.sentence)
story.mountain()
A = story.Temple()
print(A.sentence)
A.reading()
print()