常用的標準庫
在我們常用的系統windows和Linux系統中有很多支持的壓縮包格式,包括但不限于以下種類:rar、zip、tar,以下的標準庫的作用就是用于壓縮解壓縮其中一些格式的壓縮包,
zip格式
import zipfile
zipfile模塊操作壓縮包使用ZipFile類進行操作,使用方法和open的使用方法很相似,也是使用r、w、x、a四種操作模式,基本步驟也是大致分為三步:打開檔案、操作檔案、關閉檔案,可以使用with語法進行背景關系自動操作,
注意一:zipfile也是rwxa四種模式,表示也會有檔案操作中游標指標的概念,
注意二:在Python中,幾乎所有涉及到檔案相關的操作都是打開、操作、關閉三個步驟,
ZipFile引數說明
語法:ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True)
| 引數 | 含義 |
|---|---|
| file | 檔案路徑 |
| mode | 操作含義,與檔案操作中相同,默認為r, |
| compression | 壓縮方法,默認為ZIP_STORED, |
| allowZip64 | 操作的壓縮包檔案大小大于2G時應該True, 默認為True,不用管它, |
操作含義
| 模式 | 含義 |
|---|---|
| w | 創建一個新的壓縮包檔案, |
| r | 讀取已有的壓縮包檔案, |
| a | 向已有的壓縮包檔案中壓縮檔案, |
壓縮方法
在上面的compression引數中可以看到,默認的壓縮方法為ZIP_STORED,其實在zipfile模塊中定義了一些壓縮方法常量,其中最常用的為以下兩種:
ZIP_STORED = 0 # 打包歸檔(不壓縮)
ZIP_DEFLATED = 8 # 壓縮檔案(壓縮)
注意,壓縮方法指的是將檔案寫入壓縮包中采用的方法,所以,如果是解壓縮檔案,就沒必要指定這個壓縮方法了,
常用方法
write -- 指定檔案寫入壓縮包(壓縮檔案)
語法:write(filename, arcname=None)
語法:write(壓縮檔案路徑,寫入壓縮包后的路徑和名字(默認原名))
寫入檔案如果是檔案夾,那么不會將檔案夾中的內容一同寫入,
close -- 關閉物件(保存檔案)
這是我要壓縮的檔案夾,

使用ZIP_STORED壓縮,
import zipfile
# 檔案路徑
zip_file_path = r'D:\test.zip' # 壓縮包路徑
file_path = r'D:\10-中日歐美資訊決議' # 被壓縮檔案
# 默認使用ZIP_STORED
zf = zipfile.ZipFile(zip_file_path, 'w')
# 寫入檔案(檔案夾的話,不會將檔案夾中的檔案一同寫入)
zf.write(file_path)
# 關閉檔案
zf.close()
可以看到,如果檔案夾直接壓縮的話,不會將其中的檔案一同壓縮,

讓檔案夾中的所有檔案迭代寫入壓縮包中,
import os
import zipfile
def writeZip(zf, file, arc_path=None):
"""迭代壓縮檔案夾"""
# 設定壓縮路徑
if arc_path is None:
arc_path = rf'\{os.path.basename(file)}'
# 先壓縮本檔案
zf.write(file, arc_path)
# 如果是檔案夾
if os.path.isdir(file):
# 獲取它所有的子檔案
inner_files = os.listdir(file)
# 將所有的子檔案壓縮
for inner_file in inner_files:
inner_file = f'{file}{os.sep}{inner_file}'
arc = fr'{arc_path}\{os.path.basename(inner_file)}'
writeZip(zf, inner_file, arc)
# 檔案路徑
zip_file_path = r'D:\test.zip' # 壓縮包路徑
file_path = r'D:\10-中日歐美資訊決議' # 被壓縮檔案
# 默認使用ZIP_STORED
zf = zipfile.ZipFile(zip_file_path, 'w')
# 寫入檔案(自定義一個函式,迭代壓縮檔案夾)
writeZip(zf, file_path)
# 關閉檔案
zf.close()
現在就可以看到,雖然所有的檔案已經全部寫入壓縮包中,但是ZIP_STORED方法并沒有壓縮檔案,


改用ZIP_DEFLATED方法壓縮檔案,
import os
import zipfile
def writeZip(zf, file, arc_path=None):
"""迭代壓縮檔案夾"""
# 設定壓縮路徑
if arc_path is None:
arc_path = rf'\{os.path.basename(file)}'
# 先壓縮本檔案
zf.write(file, arc_path)
# 如果是檔案夾
if os.path.isdir(file):
# 獲取它所有的子檔案
inner_files = os.listdir(file)
# 將所有的子檔案壓縮
for inner_file in inner_files:
inner_file = f'{file}{os.sep}{inner_file}'
arc = fr'{arc_path}\{os.path.basename(inner_file)}'
writeZip(zf, inner_file, arc)
# 檔案路徑
zip_file_path = r'D:\test.zip' # 壓縮包路徑
file_path = r'D:\10-中日歐美資訊決議' # 被壓縮檔案
# 使用ZIP_DEFLATED壓縮
zf = zipfile.ZipFile(zip_file_path, 'w', zipfile.ZIP_DEFLATED)
# 寫入檔案(自定義一個函式,迭代壓縮檔案夾)
writeZip(zf, file_path)
# 關閉檔案
zf.close()
可以看到,檔案是壓縮寫入內部的,


解壓縮
解壓縮有如下兩種方法,注意,解壓縮就是在讀檔案,要將操作模式變更為r,
| 方法 | 說明 |
|---|---|
| extract | 解壓縮單個指定的檔案, |
| extractall | 解壓縮所有的檔案, |
語法:extract(member,path=None, pwd=None)
語法:extract(指定檔案(壓縮包中的路徑),解壓到的位置(默認為當前作業目錄),指定的密碼(有些壓縮包有密碼,格式為位元組流))
語法:extractall(path=None, pwd=None)
語法:extractall(解壓到的位置, 密碼)
注意:解壓檔案和路徑中的檔案夾同名會報錯,因為檔案無法重置檔案夾,
namelist -- 迭代回傳壓縮包中的檔案
import zipfile
with zipfile.ZipFile(r'D:\test.zip') as zf:
res = zf.namelist()
print(res)
# ['10-中日歐美資訊決議/', '10-中日歐美資訊決議/1-代碼/', ...]
infolist -- 迭代回傳壓縮包中的檔案資訊
比如檔案的權限等,
printdir -- 查看壓縮包中的檔案的資訊
查看壓縮包中的檔案資訊,比如檔案的大小、創建日期等,默認查看所有的檔案,
語法:printdir(file=None)
tar包 和 gz、bz2、xz格式
import tarfile
tarfile的使用和檔案操作更加的相似,只是在壓縮模式上略有不同,
使用linux系統的朋友都知道,tar是Linux的一種打包方式,打包成為tar包之后,才可以使用其它的壓縮程式去壓縮,最常用的壓縮方式是gzip,壓縮率最高的方式bzip2,此外還支持另一種比較小眾的xzip格式,
主要操作方法為tarfile.TarFile.open(),可以直接tarfile.open(),
語法:open(name, mode='r')
當初在學習的時候,老師還教有encoding='UTF-8'引數,但是檔案操作要什么編碼格式?感覺他是為了方便直接從檔案操作的代碼上直接復制過來的,然后沒有刪掉,
操作tar包
模式為r、w、a、x四種為主,外加使用add方法寫入檔案,退出依然使用close方法,
add(name, arcname)
add(壓縮檔案,壓縮別名)
注意,壓縮別名一定不要以路徑分隔符為結尾,否則只會創建一個檔案夾,
import tarfile
with tarfile.open('test.tar', 'w') as tf:
tf.add('test.txt')
壓縮
壓縮的方式主要是將模式改變,在rwx的基礎上加上各個壓縮的方式,變成:r:gz、w:bz2、x:xz等樣式,然后在將剛才創建的tar包壓縮,當然也可以直接將檔案壓縮成為壓縮包,
注意,a模式不能配備任何壓縮模式,因為gzip、bzip2、xzip不能直接往里面追加檔案,所以如果要追加檔案,將tar包解壓縮出來,然后追加再壓縮,
import tarfile
# tar包以gzip格式壓縮
with tarfile.open('test.tar.gz', 'w:gz') as tf:
tf.add('test.tar')
解壓縮
tarfile的解壓縮方法和zipfile的一模一樣,
| 方法 | 含義 |
|---|---|
| extract | 解壓縮指定檔案 |
| extractall | 解壓縮所有檔案 |
getnames -- 回傳壓縮包中的檔案(list)
洗掉壓縮包中的檔案
zipfile和tarfile不支持洗掉壓縮包中的檔案,所以如果有需要洗掉壓縮包中的檔案,可以將壓縮包解壓出來,然后洗掉其中的檔案,再壓縮,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/492237.html
標籤:Python
上一篇:python3GUI--仿做一個網易云音樂By:PyQt5(附下載地址)
下一篇:Python人臉識別簽到考勤系統
