壓縮包也是我們平時工作中經常要接觸到的文件格式,壓縮文件後綴名通常有 .Zip、.rar、.7z 等等。Python 中也有專門用來操作壓縮包文件的第三方模塊 zipFile。聽這個名字就知道是用來操作壓縮包文件的了,這個第三方模塊也是我們本節課的重點,下面我們就一起來看一下。
1. zipfile 模塊介紹zip 文件格式是通用的文檔壓縮标準,在 ziplib 模塊中,提供 ZipFile 類操作 zip 文件,如創建、讀取、寫入、附加、顯示壓縮文件等操作。
1.1 安裝zipfile 是 Python 的第三方庫,使用前需要通過以下命令進行安裝:
pip install zipfile
步驟 1:導入 zipfile 模塊
import zipfile
步驟 2:實例化 zipfile 對象
z = zipfile.ZipFile(file, mode='r')
打開或者新建一個 zip 文件對象,第一個參數為 file 文件地址,第二個參數為打開模式,當模式參數是 ‘r’ 表示讀取現有的文件,為 ‘w’ 表示覆蓋或寫入一個新的文件,為 ‘a’ 表示将追加到現有文件。
步驟 3:進行壓縮文件操作
通過 zipfile 模塊提供的方法對壓縮文件進行創建、讀取、解壓等操作。
步驟 4:關閉壓縮文件
z = zipfile.ZipFile(file, mode='r')
...省略部分代碼
z.close()
注意:zipfile 在使用後,必須在退出程序之前調用 close () 方法否則将不會寫入關鍵記錄數據。
2. 使用 zipfile 模塊進行壓縮與解壓縮現在 D:\code 目錄已有 code.zip,内容如下圖所示。
接下來通過 zipfile 模塊對壓縮文件進行操作,zipfile 模塊操作壓縮文件常用方法見下表。
方法名 |
描述 |
namelist() |
返回 ZIP 文件内所有成員名字列表 |
write() |
添加文件到壓縮包内 |
extract(member[, path[, pwd]]) |
解壓單個文件,參數 members 表示 zipfile 對象中某個文件名,path 為解壓到的目的路徑,默認是壓縮包所在路徑,pwd 為壓縮包密碼,默認無密碼 |
extractall([path[, members[, pwd]]]) |
解壓所有文件,參數 path 為解壓到的目的路徑,默認是壓縮包所在路徑,members 默認值是壓縮包文件中所有文件名稱列表,也可以另外指定,pwd 為壓縮包密碼,默認無密碼 |
下面來具體看下每個方法的使用:
import zipfile, os
zipFile = zipfile.ZipFile(os.path.join(os.getcwd(), 'code.zip'))
print(zipFile.namelist())
#輸出: ['code/', 'code/index.py', 'code/newimage/', 'code/writeppt.py', 'code/writeword.py']
代碼解釋:namelist () 方法獲取壓縮包中所有文件的名字,并組成列表返回。首先通過 ZipFile 實例化 zip 文件對象,其中壓縮文件這裡通過 OS 模塊的 join 方法進行拼接,返回一個絕對路徑。通過 namelist () 方法打印輸出:
['code/', 'code/index.py', 'code/newimage/', 'code/writeppt.py', 'code/writeword.py']
import zipfile, os
zipFile = zipfile.ZipFile(os.path.join(os.getcwd(), 'code.zip'),'a')
zipFile.write("test.txt")
print(zipFile.namelist())
#輸出: ['code/', 'code/index.py', 'code/newimage/', 'code/writeppt.py', 'code/writeword.py','code/test.txt']
代碼解釋:write () 方法為添加文件到壓縮文件,在 D:\code 目錄下,創建 test.txt 文件,通過 wirte () 方法添加到現有壓縮文件 code.zip 中,執行完成後,通過 namelist () 方法重寫打印壓縮文件中所有成員名字列表,輸出 ['code/', 'code/index.py', 'code/newimage/', 'code/writeppt.py', 'code/writeword.py','code/test.txt']。上述代碼中需要注意:
向壓縮文件中寫入内容時,注意修改 zipFile 實例化處的模式,默認為 “r”,表示隻讀,不可以寫入,設置為 “w” 後可以寫入,但會覆蓋原有壓縮文件中内容,如果想要追加,設置為 “a” 即可。
import zipfile, os
zipFile = zipfile.ZipFile(os.path.join(os.getcwd(), 'code.zip'))
for file in zipFile.namelist():
zipFile.extract(file)
zipFile.close()
代碼解釋:extract () 方法為單個壓縮文件解壓,代碼中結合 namelist () 方法将 D:\code\code.zip 進行解壓縮操作,解壓後效果如下圖所示。
import zipfile, os
zipFile = zipfile.ZipFile(os.path.join(os.getcwd(), 'code.zip'))
zipFile.extractall()
zipFile.close()
代碼解釋:extractall () 方法為解壓 zip 文檔中的所有文件到指定目錄,默認為壓縮包所在路徑,即當前目錄。代碼執行完成後,效果同 extract () 結合 namelist () 方法進行解壓操作一樣。
3. zipfile 模塊實戰在上一小節中,使用 os 模塊封裝了程序遇到異常情況時記錄錯誤日志文件的方法,本小節 zipfile 模塊實戰在上一小節代碼的基礎上進行實現。
在服務器上存儲的錯誤日志文件,一定周期需要進行下載,為了防止下載過程中出現文件丢失或亂碼的情況,通常采用創建壓縮包的形式。但手動創建無疑是費時費力且容易出現錯誤的,這時可以使用 zipfile 模塊結合 os 模塊,實現将 2020 年下,每個月份的錯誤日志記錄文件夾,創建相對的壓縮文件,如 1 月,對應 1.zip,2 月對應 2.zip。目前服務器上 1-11 月的錯誤日志文件存儲結構如下圖所示。
以 1 月為例,1 月文件夾下的文件存儲結構如下圖所示。
根據上述需求背景,封裝後的代碼如下:
import zipfile
import os
# 制定要生成壓縮文件的路徑
filepath = "./2020"
# 創建壓縮文件
def createzipfile(month):
# 壓縮包文件名稱
zipName = month '.zip'
f = zipfile.ZipFile(zipName, 'a')
# 遍曆當前文件夾
for dirpath, dirnames, filenames in os.walk(filepath "/" month):
for filename in filenames:
f.write(os.path.join(dirpath, filename))
f.close()
# 遍曆當前目錄下的文件夾
for item in os.listdir(filepath):
# 調用創建壓縮文件方法
createzipfile(str(item))
代碼解釋:通過 os.listdir () 方法獲取到要壓縮的目錄下所有的文件夾,即獲取到 1,2,3,4…,在遍曆中調用 createzipfile () 方法,将文件夾名稱傳入。在 createzipfile () 方法中,使用 zipfile.ZipFile 創建壓縮文件,在向壓縮文件寫入内容時,通過 os.walk () 方法對當前月的目錄進行遍曆,嵌套 for…in 循環中,将文件寫入到壓縮文件。代碼執行完成後,創建好的壓縮文件如下圖所示。
本節課程我們主要學習了 zipfile 模塊的使用。本節課程的重點如下:
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!