第七章:模塊和庫類

第一節:關於模塊和類庫

使用系統標準庫

什麼是模塊?
可以說,一個 xxx.py 就是一個模塊。
什麼是類庫?
裝有很多個模塊的文件夾包,可以稱爲一個類庫,更多的時候,這些python文件都是有機關聯的。
有了模塊和類庫,我們可以輕鬆地站在巨人的肩膀上進行編程,例如我們使用的系統標準庫第三方類庫甚至是自己寫的類庫

  • 導入外部模塊

從外部導入模塊,有導入模塊和導入成員兩種方式,具體包括:
方式一:import path.module #導入模塊
方式二: from path.module import member1,member2,… #導入指定模塊下的具體成員
或者 :from path.module import * #導入指定模塊下的全部成員

path指代模塊所在的路徑
module是模塊,模塊即xxx.py
member可以是變量、函數、類、以及包;

機智的導入
一個機智式的導入方式爲:直寫出需要的模塊名或成員名,此時系統報語法錯誤,光標放在報錯處,使用【alt】+【enter】快捷鍵,系統會自動識別和導入;

  • 什麼是包

含有_ init _.py的文件夾稱之爲【包】;
在_ init .py中,我們可以爲包中的其它模塊做一些全局初始化的工作;
_ init
.py可以視爲一個【與包名同名的模塊】,引入 _init _.py中的成員方式爲:
from 包名 import member
包文件夾中的xxx.py可以視爲包模塊的成員member,它的導入方式可以是:
import 包名.xxx,此時包被視爲一個普通文件夾路徑
from 包名 import xxx,此時包被視爲一個模塊,xxx.py被視爲一個成員

  • 路徑path

path是相對路徑: 相對於【系統庫標準庫根目錄】或【第三方庫根目錄】或【當前工程根目錄】;
系統標準庫根目錄所在的位置爲:解釋器安裝目錄/Lib/
例如:C:\Python36\Lib;
第三方庫根目錄所在位置爲:解釋器安裝目錄/Lib/site-packages/
例如:C:\Python36\Lib\site-packages;
如果是導入工程內的模塊,則相對路徑的根目錄爲當前工程目錄;

  • 迴歸測式

迴歸測試的作用是避免自動觸發外部模塊的業務邏輯
當我們導入一個自定義模塊的時候,如果這個模塊在成員定義以外,還包含一定的業務邏輯代碼,則這些代碼必須被寫在【迴歸測試】中;
如果模塊的業務邏輯不寫在迴歸測試中,則外界在將其導入時(無論是導入模塊還是導入成員),這些業務邏輯都會被自動觸發;
我們通常會在迴歸測試中,測試一下自己寫的函數和類是否正確

迴歸測試的寫法:

if __name__ == '__main__':
    # 一些業務邏輯
    pass

安裝第三方庫

系統標準庫是安裝Python解釋器時,自帶安裝的一些最基本最常用的的Python類庫,它們的位置是:解釋器安裝目錄/Lib/
光有系統標準庫是遠遠不能滿足多樣化的開發需求的,我們還常常要使用到一些【第三方類庫】,它們的位置是:解釋器安裝目錄/Lib/site-packages/

  • 安裝第三方類庫:

Python解釋器自帶一個包管理工具pip.exe,它的位置是:解釋器安裝目錄/Scripts/,通常我們在安裝解釋器時都選擇將這個目錄放到系統的環境變量中;

安裝方式一:自動化安裝第三方類庫最簡單的方式是在【控制檯】中輸入:

pip install 包名

包管理器pip會自動尋找和安裝xxx及其所依賴的其它類庫

安裝方式二:在pip.exe同目錄下還存在easy_install.exe,我們同樣可以在【控制檯】中輸入:

easy_install 包名

pipeasy_install二者的區別是:pip 改善了不少 easy_install 的缺點,因此通常pip是一個更好的選擇,除非某些類庫指定使用easy_install進行安裝
pip的常用命令
安裝類庫:pip install 包名
更新類庫:pip install -U 包名
卸載類庫:pip uninstall 包名
檢索類庫:pip search 包名
查看幫助:`pip help
以上命令也都有對應的easy_install版本,其功能是相同的

方式三:使用PyCharm安裝和管理類庫

打開IDE的設置,在工程解釋器欄目中,我們可以通過點擊如圖所示的“+”和“-”來執行類庫的安裝與卸載;
點擊“+”後,在彈出的搜索框中輸入類庫名稱,在檢索成功後點擊install按鈕,即可自動化完成安裝;
還更多圖形化功能,如藍色升級箭頭實現升級、安裝時勾選安裝到用戶的第三方路徑等

在這裏插入圖片描述

無論使用哪一種方式進行第三式庫的安裝,安裝效果是一樣的,安裝成功後pycharm就可以簡單使用了

使用自己寫的類庫

  • 將模塊和包持久化爲類庫

一個複用率很高的本地的源碼目錄,我們可以考慮將其持久化爲類庫,這樣就可以在所有工程中進行導入和使用;
持久化的方式很簡單,就是將這個文件夾拷貝到【系統庫標準庫根目錄】或【第三方庫根目錄】中,通常如無特殊必要,我們選擇放在【第三方庫根目錄】中,即解釋器安裝目錄/Lib/site-packages/
以後就可以像導入系統標準庫或安裝的第三方類庫一樣,使用我們自己定義的類庫了;
當然,如果願意共享,以後還可以選擇將這部分代碼,附帶一些說明文檔,共享到開源代碼管理平臺如github上去,供全世界的程序員使用;

第二節:關於time模塊

time模塊

datetime模塊

calendar模塊

第三節:關於 os 文件模塊

使用os模塊的文件操作

os模塊是系統標準庫模塊;
os模塊常用的文件操作包括:
1、創建單級或多層級的文件夾、
2、刪除單級或多層級空文件夾、
3、刪除文件;
os模塊中的path子模塊常用文件操作:
1、判斷路徑是否存在
2、判斷路徑是否是文件/文件夾;
3、刪除有內容的文件夾,這時要使用另一個標準庫模塊:shutil.rmtree(path)

  • 相對路徑和絕對路徑

【絕對路徑】是從具體盤符出發的路徑;
【相對路徑】是從當前py文件位置出發的路徑;
相對路徑中以一個點“./”代表當前位置,兩個點“../”代表上一級文件夾路徑;
順斜線“/”是Linux和Windows下通用的路徑分隔符,反斜線則只適用於Windows
在使用反斜線作爲路徑分隔符時,通常在路徑前面加一個“r”代表所有的反斜線都不是轉義字符;

  • 文件操作

os.mkdir() —— 創建單級文件夾
os.makedirs() —— 創建層級文件夾
os.rmdir() —— 刪除空文件夾
shutil.rmtree() —— 刪除有內容的文件夾
os.remove() —— 刪除文件
os.removedirs() —— 刪除文件夾

例:

import os
import shutil


# 創建單級文件夾(在當前的上一層文件夾位置創建)
os.mkdir(r"../res")
os.mkdir(r"../res/doc")

# 創建層級文件夾(在當前的上一層文件夾位置創建)
os.makedirs(r"../res/img/large")

# 刪除空文件夾(在當前的上一層文件夾位置刪除)
os.rmdir(r"../res/img")

# 刪除有內容的文件夾
shutil.rmtree(r"../res/img")

# 刪除文件或文件夾
os.remove(r"../res/doc/1.txt")
os.removedirs(r"../res/doc") # 刪除一整條空路徑

除了創建和刪除文件,還能對文件進行判斷

os.path.exists() ——判斷路徑是否存在
os.path.isfile() —— 判斷路徑是否是文件
os.path.isdir() —— 判斷路徑是否是文件夾

例:

import os

#  判斷路徑是否存在
fileExists = os.path.exists(r"./mg.py")
print(fileExists)

# 判斷路徑是否是文件/文件夾
isFile = os.path.isfile(r"./mg.py")
isDir = os.path.isdir(r"./mg.py")
print(isFile)
print(isDir)

執行結果:
在這裏插入圖片描述

文件的基本讀寫模式 r、w、a、x

通過系統內建函數 open() 我們可以打開一個文件,得到文件流對象file(後文所有file均指文件流對象);
位置參數name代表文件路徑,可以是絕對路徑或相對路徑;
encoding參數指定文件的編碼方式,默認爲utf-8,編碼錯誤會導致亂碼;
mode參數代表以什麼模式打開文件,如果打開的是字符流文件,那麼有四種基本模式;
1、r(只讀模式)
2、w(覆寫模式)
3、a(追加模式)
4、x(創寫模式);
注意文件夾路徑必須是存在的,否則會報FileNotFoundError錯誤
注意:讀寫操作結束,記得關閉已打開的文件流,以釋放資源

  • 只讀模式 r

open()通過定義參數只讀模式r打開的文件,表示該文件只能讀不能寫,強寫會拋異常;
以只讀模式打開的文件,文件指針(暫時可以簡單理解爲光標)在文件開頭位置
通過file.read(n)可以讀入指定數量的字符,n不寫默認爲讀入全部
在讀入的過程中,文件指針會相應的向後移動n個字符位置

例:在當前目錄下創建了一個myfile.txt文件,並寫下了一首詩,現在以只讀模式打開
在這裏插入圖片描述

# 以只讀模式打開文件
file = open(r"./myfile.txt", "r", encoding="utf-8")

# file的類型
print(type(file)) 

#  讀入文件內容
content = file.read(4) # 讀入4個字符
# content = file.read()#不寫參數表示讀入全部
print(content)

# 嘗試寫入數據(只讀模式無法寫入,會報錯)
# file.write("2018年11月13日")    #io.UnsupportedOperation: not writable

#  關閉文件流,注意每次打開操作後一定要關閉
file.close()

執行結果:
在這裏插入圖片描述

  • 覆寫模式 w

1、以覆寫模式w打開的文件,在文件打開的一剎那文件內容將被清空
2、使用file.write(text)向文件中寫入一個字符串;
3、使用file.writelines(strlist)向文件中寫入一個字符串列表,每個字符串元素單獨佔據一行;
注意:以覆寫模式打開的文件是不可讀的,強讀會拋異常

例:同樣以上面的file.txt爲例,此時裏面已經有一首詩《望天門山》

# 以覆寫模式打開文件,會清空文件內容(請謹慎)
file = open(r"./myfile.txt", mode="w", encoding="utf-8")

# 寫入內容(一個字符串)
file.write("鋤禾日當午\n汗滴禾下土\n一本小破書\n看了一下午\n\n")
# 寫入內容(一個字符串列表)
file.writelines(["鋤禾日當午\n", "汗滴禾下土\n", "一本小破書\n", "看了一下午\n"])

# 嘗試讀入文件(不可讀)
#  file.read()      #io.UnsupportedOperation: not readable

#  關閉文件流
file.close()

執行完再次手動打開myfile.txt,發現原本內容已清空,並寫入了兩首詩
在這裏插入圖片描述

  • 追加模式 a

已追加模式a打開的文件,文件指針位於文件的末尾
此時向文件中寫入內容,將以追加的方式寫入,原來的內容不會被刪除

例:以之前寫入了《望天門山》的myfile.txt爲例,以追加模式,只是向下繼續增加內容

# 追加模式打開文件
file = open(r"./myfile.txt", "a", encoding="utf-8")

# 追加一個字符串
file.write("\n從前\n從前不洗澡\n處處蚊子咬\n夜裏長泡泡\n一看真不少\n")

# 關閉文件流
file.close()

執行完再次手動打開myfile.txt,發現原本內容不變,並往下新添加了一首詩

在這裏插入圖片描述

  • 創寫模式 x

以創寫模式x打開的文件必須是一個不存在的文件
如果文件已經存在會報FileExistsError異常;
使用創寫模式結合try…except…我們可以保證打開的都是不存在的文件,而不會覆蓋已有的文件;

這裏還要提一個file.flush()的方法:
這是一個保證數據完整性的方法,一般的文件流操作都包含緩衝機制,write方法並不直接將數據寫入文件,而是先寫入內存中特定的緩衝區
flush方法是用來刷新緩衝區的,即將緩衝區中的數據立刻寫入文件,同時清空緩衝區。
正常情況下緩衝區滿時,操作系統會自動將緩衝數據寫入到文件中。
至於close方法,原理是內部先調用flush方法來刷新緩衝區,再執行關閉操作,這樣即使緩衝區數據未滿也能保證數據的完整性。
如果進程意外退出或正常退出時而未執行文件的close方法,緩衝區中的內容將會丟失。

例:

# 以創寫模式打開一個並不存在的文件
file = open(r"./yourFile.txt", "x", encoding="utf-8")

# 向文檔中寫入數據
file.write("鋤禾日當午\n汗滴禾下土\n一本小破書\n一看一下午\n")

# 讓寫入(緩存在緩衝區中)立刻生效
file.flush()

# 關閉文件流
file.close()

執行結果:自動生成文件yourFile.txt,並寫入了內容
在這裏插入圖片描述

文件的字節讀寫模式 rb,wb,ab,xb

  • 字節流文件的讀寫

通過基本讀寫模式(只讀r,覆寫w,追加a,創寫x)我們可以方便地操作字符流文件的讀寫;
對於【字節流文件】(一切非字符型文件,包括媒體文件、可執行文件、壓縮包、等等),我們則需要使用字節讀寫模式來進行相應的讀寫操作;
與基本讀寫模式對應,字節讀寫模式有四種:rb,wb,ab,xb,分別對應字節只讀、字節覆寫、字節追加、字節創寫;
字節讀寫模式與普通讀寫模式所不同的,僅僅在於讀入和寫出的內容都是字節形式,而非以字符串形式

首先打開文件,看看文件的字節流
例:

# 以字節只讀模式打開一張圖片文件
myFile = open(r"./image/timg.jpg", "rb")
myBytes = myFile.read()
print(myBytes)

執行結果:
在這裏插入圖片描述
例:拷貝圖片

圖片屬於媒體文件,不論讀寫都應以相應的字節模式來操作;
我們以字節只讀方式打開被拷貝的文件,以字節創寫模式創建並打開一個要拷貝到的目標文件;
通過file.read(size)我們可以讀出指定字節數的內容,默認爲讀出全部;
通過file.write(content)我們可以寫入指定的內容(字符字節都可以);
最終記得關閉本體和目標兩個文件;

# 以字節只讀模式打開圖片文件
myFile = open(r"./image/timg.jpg", "rb")
myBytes = myFile.read()
# print(myBytes)

# 以字節創寫模式打開圖片文件
yFile = open(r"./image/timg2.jpg", "xb")
#把timg.jpg的字節流寫入文件
byteCount = yFile.write(myBytes)
print("寫入的字節數量是%d" % (byteCount))

# 分別關閉文件流
myFile.close()
yFile.close()

執行結果:成功地複製了一張圖片
在這裏插入圖片描述

文件的加強讀寫模式 r+、w+、a+

字符流文件的四種基本讀寫模式:r/w/a/x,都是隻能讀或只能寫的,強讀強寫會報錯
接下來要介紹的【加強讀寫模式】則是全部是可讀可寫的
它們分別是:
1、讀優先的r+
2、覆寫優先的w+
3、追加優先的a+
它們之間的區別在於文件打開時,文件指針的位置在哪;

  • 讀優先的加強模式 r+

文件打開時,文件指針位於0的位置,便於從頭開始讀取文件;
因此我們稱它是 讀優先 的;

例:

file = open(r"./myfile.txt", "r+", encoding="utf-8")

# 開始讀取時的指針位置'
print("當前文件指針在%d" % (file.tell()))

# 讀取4個字符。對於ASCII字符,每字符指針移動1位,對於漢字,每字符指針移動3位
print(file.read(4))
print("當前文件指針在%d" % (file.tell())) 

# 繼續讀取4個字符
print(file.read(4))
print("當前文件指針在%d" % (file.tell()))

# 繼續移動文件指針到指定位置
file.seek(0)
print("當前文件指針在%d" % (file.tell()))
print(file.read(8))

# 寫入內容
# 寫入之前應明確地seek到指定位置,否則會追加在末尾,但是指定位置也有缺點,就是會覆蓋後面的文字
#此處移動到倒數第二個文字之後
file.seek(196) 
file.write("唐詩三百首")

#關閉文件流
file.close()

執行結果:
在這裏插入圖片描述文件內容執行後結果:我們發現,最後一個字被覆蓋了。
在這裏插入圖片描述
我們發現,最後一個字被覆蓋了。當然也可以不seek到指定位置,此時就會把內容追加在末尾

  • 覆寫優先的加強模式 w+

文件以w+打開時,內容會被 清空,自然文件指針也就位於0的位置;
這種模式先清空內容以便覆寫,因此我們稱它是 覆寫優先 的;

例:

file = open(r"./myfile.txt", "w+", encoding="utf-8")

# 可讀可寫,打開文件時內容被清空
print('此時指針在:',file.tell())
print('內容是:',file.read())

# 寫入內容
file.write("別人笑我太瘋癲,我笑他人看不穿")
print('寫入內容後指針在:',file.tell())

# 移動指針
file.seek(0)
print('此時指針在:',file.tell())
print('內容是:',file.read())
print('讀取內容後指針在:',file.tell())

# 半閉文件流
file.close()

執行結果:
在這裏插入圖片描述
在這裏插入圖片描述

  • 追加優先的加強模式 a+

文件以a+模式打開時,文件指針位於 末尾的位置,便於我們追加內容;因此我們稱它是追加優先的;

例:

file = open(r"./myfile.txt", "a+", encoding="utf-8")

# 文件打開時指針在最後
print('打開時指針在:',file.tell())

# 追加文字
file.write("\n不見五陵豪傑墓,無花無酒鋤作田")
print('追加內容後此時指什在:',file.tell())

# 移動指針,讀取內容(一定要移動指針到0,纔可以讀取內容,讀取原則是讀取指針後面的內容)
file.seek(0)
print('移動後此時指什在:',file.tell())
print(file.read())
print('讀取後此時指什在:',file.tell())

# 關閉文件流
file.close()

執行結果:
在這裏插入圖片描述

文檔的遍歷和截取

  • 文檔的遍歷

文檔的遍歷常用的有三種方式:
1、逐行readliine()讀取,
2、readlines()拿到所有行的列表,
3、迭代器式遍歷;

例:在myfile.txt內寫下了4行詩句,對此文檔進行遍歷。

方式1:通過file.readline()逐行讀取

file = open(r"./myfile.txt", "r", encoding="utf-8")

#一個file.readline(),就讀取一行
print(file.readline())
print(file.readline())
print(file.readline())
print(file.readline())

# 關閉文件流
file.close()

執行結果:

使用此方法,可以一行一行讀取,一個file.readline()就能讀取一行,讀取後會自動生成一行空行(不會對原文產生更改),如果文檔的篇幅很長,此方法將過於累人。

方式2:通過file.readlines()得到所有行形成的列表,再對列表進行遍歷
方式3:將文件作爲一個迭代器進行遍歷,其中的每一個元素爲一行文本

  • 文檔的截取

文件指針

使用tkinter定位本地文件

文件模塊常用API彙總

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章