python標(biāo)準(zhǔn)庫壓縮包模塊zipfile和tarfile詳解(常用標(biāo)準(zhǔn)庫)
常用的標(biāo)準(zhǔn)庫
在我們常用的系統(tǒng)windows和Linux系統(tǒng)中有很多支持的壓縮包格式,包括但不限于以下種類:rar、zip、tar,以下的標(biāo)準(zhǔn)庫的作用就是用于壓縮解壓縮其中一些格式的壓縮包。
zip格式
import zipfile
zipfile模塊操作壓縮包使用ZipFile類進(jìn)行操作,使用方法和open的使用方法很相似,也是使用r、w、x、a四種操作模式。基本步驟也是大致分為三步:打開文件、操作文件、關(guān)閉文件??梢允褂脀ith語法進(jìn)行上下文自動(dòng)操作。
注意一:zipfile也是rwxa四種模式,表示也會(huì)有文件操作中光標(biāo)指針的概念。
注意二:在Python中,幾乎所有涉及到文件相關(guān)的操作都是打開、操作、關(guān)閉三個(gè)步驟。
ZipFile參數(shù)說明
語法:ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True)
| 參數(shù) | 含義 |
|---|---|
| file | 文件路徑 |
| mode | 操作含義,與文件操作中相同,默認(rèn)為r。 |
| compression | 壓縮方法,默認(rèn)為ZIP_STORED。 |
| allowZip64 | 操作的壓縮包文件大小大于2G時(shí)應(yīng)該True, 默認(rèn)為True,不用管它。 |
操作含義
| 模式 | 含義 |
|---|---|
| w | 創(chuàng)建一個(gè)新的壓縮包文件。 |
| r | 讀取已有的壓縮包文件。 |
| a | 向已有的壓縮包文件中壓縮文件。 |
壓縮方法
在上面的compression參數(shù)中可以看到,默認(rèn)的壓縮方法為ZIP_STORED。其實(shí)在zipfile模塊中定義了一些壓縮方法常量,其中最常用的為以下兩種:
ZIP_STORED = 0 # 打包歸檔(不壓縮) ZIP_DEFLATED = 8 # 壓縮文件(壓縮)
注意,壓縮方法指的是將文件寫入壓縮包中采用的方法,所以,如果是解壓縮文件,就沒必要指定這個(gè)壓縮方法了。
常用方法
write -- 指定文件寫入壓縮包(壓縮文件)
語法:write(filename, arcname=None)
語法:write(壓縮文件路徑,寫入壓縮包后的路徑和名字(默認(rèn)原名))
寫入文件如果是文件夾,那么不會(huì)將文件夾中的內(nèi)容一同寫入。
close -- 關(guān)閉對象(保存文件)
這是我要壓縮的文件夾。

使用ZIP_STORED壓縮。
import zipfile # 文件路徑 zip_file_path = r'D:\test.zip' # 壓縮包路徑 file_path = r'D:\10-中日歐美信息解析' # 被壓縮文件 # 默認(rèn)使用ZIP_STORED zf = zipfile.ZipFile(zip_file_path, 'w') # 寫入文件(文件夾的話,不會(huì)將文件夾中的文件一同寫入) zf.write(file_path) # 關(guān)閉文件 zf.close()
可以看到,如果文件夾直接壓縮的話,不會(huì)將其中的文件一同壓縮。

讓文件夾中的所有文件迭代寫入壓縮包中。
import os
import zipfile
def writeZip(zf, file, arc_path=None):
"""迭代壓縮文件夾"""
# 設(shè)置壓縮路徑
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-中日歐美信息解析' # 被壓縮文件
# 默認(rèn)使用ZIP_STORED
zf = zipfile.ZipFile(zip_file_path, 'w')
# 寫入文件(自定義一個(gè)函數(shù),迭代壓縮文件夾)
writeZip(zf, file_path)
# 關(guān)閉文件
zf.close()
現(xiàn)在就可以看到,雖然所有的文件已經(jīng)全部寫入壓縮包中,但是ZIP_STORED方法并沒有壓縮文件。


改用ZIP_DEFLATED方法壓縮文件。
import os
import zipfile
def writeZip(zf, file, arc_path=None):
"""迭代壓縮文件夾"""
# 設(shè)置壓縮路徑
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)
# 寫入文件(自定義一個(gè)函數(shù),迭代壓縮文件夾)
writeZip(zf, file_path)
# 關(guān)閉文件
zf.close()
可以看到,文件是壓縮寫入內(nèi)部的。


解壓縮
解壓縮有如下兩種方法,注意,解壓縮就是在讀文件,要將操作模式變更為r。
| 方法 | 說明 |
|---|---|
| extract | 解壓縮單個(gè)指定的文件。 |
| extractall | 解壓縮所有的文件。 |
語法:extract(member,path=None, pwd=None)
語法:extract(指定文件(壓縮包中的路徑),解壓到的位置(默認(rèn)為當(dāng)前工作目錄),指定的密碼(有些壓縮包有密碼,格式為字節(jié)流))
語法:extractall(path=None, pwd=None)
語法:extractall(解壓到的位置, 密碼)
注意:解壓文件和路徑中的文件夾同名會(huì)報(bào)錯(cuò),因?yàn)槲募o法重置文件夾。
namelist -- 迭代返回壓縮包中的文件
import zipfile
with zipfile.ZipFile(r'D:\test.zip') as zf:
res = zf.namelist()
print(res)
# ['10-中日歐美信息解析/', '10-中日歐美信息解析/1-代碼/', ...]infolist -- 迭代返回壓縮包中的文件信息
比如文件的權(quán)限等。
printdir -- 查看壓縮包中的文件的信息
查看壓縮包中的文件信息,比如文件的大小、創(chuàng)建日期等。默認(rèn)查看所有的文件。
語法:printdir(file=None)
tar包 和 gz、bz2、xz格式
import tarfile
tarfile的使用和文件操作更加的相似,只是在壓縮模式上略有不同。
使用linux系統(tǒng)的朋友都知道,tar是Linux的一種打包方式,打包成為tar包之后,才可以使用其它的壓縮程序去壓縮。最常用的壓縮方式是gzip,壓縮率最高的方式bzip2,此外還支持另一種比較小眾的xzip格式。
主要操作方法為tarfile.TarFile.open(),可以直接tarfile.open()。
語法:open(name, mode='r')
當(dāng)初在學(xué)習(xí)的時(shí)候,老師還教有encoding='UTF-8'參數(shù),但是文件操作要什么編碼格式?感覺他是為了方便直接從文件操作的代碼上直接復(fù)制過來的,然后沒有刪掉。
操作tar包
模式為r、w、a、x四種為主,外加使用add方法寫入文件,退出依然使用close方法。
add(name, arcname)
add(壓縮文件,壓縮別名)
注意,壓縮別名一定不要以路徑分隔符為結(jié)尾,否則只會(huì)創(chuàng)建一個(gè)文件夾。
import tarfile
with tarfile.open('test.tar', 'w') as tf:
tf.add('test.txt')壓縮
壓縮的方式主要是將模式改變,在rwx的基礎(chǔ)上加上各個(gè)壓縮的方式,變成:r:gz、w:bz2、x:xz等樣式,然后在將剛才創(chuàng)建的tar包壓縮,當(dāng)然也可以直接將文件壓縮成為壓縮包。
注意,a模式不能配備任何壓縮模式,因?yàn)間zip、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不支持刪除壓縮包中的文件,所以如果有需要?jiǎng)h除壓縮包中的文件,可以將壓縮包解壓出來,然后刪除其中的文件,再壓縮。
到此這篇關(guān)于python標(biāo)準(zhǔn)庫壓縮包模塊zipfile和tarfile詳解(常用標(biāo)準(zhǔn)庫)的文章就介紹到這了,更多相關(guān)python壓縮包模塊zipfile和tarfile內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python面向?qū)ο髮?shí)現(xiàn)一個(gè)對象調(diào)用另一個(gè)對象操作示例
這篇文章主要介紹了Python面向?qū)ο髮?shí)現(xiàn)一個(gè)對象調(diào)用另一個(gè)對象操作,結(jié)合實(shí)例形式分析了Python對象的定義、初始化、調(diào)用等相關(guān)操作技巧,需要的朋友可以參考下2019-04-04
Python基于hashlib模塊的文件MD5一致性加密驗(yàn)證示例
這篇文章主要介紹了Python基于hashlib模塊的文件MD5一致性加密驗(yàn)證,涉及Python使用hashlib模塊進(jìn)行字符串與文件的MD5加密驗(yàn)證操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-02-02
使用BeautifulSoup4解析XML的方法小結(jié)
這篇文章主要介紹了使用BeautifulSoup4解析XML的方法小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
Python 調(diào)用 Outlook 發(fā)送郵件過程解析
這篇文章主要介紹了Python 調(diào)用 Outlook 發(fā)送郵件過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
Python+Pygame實(shí)戰(zhàn)之詩詞填空游戲的實(shí)現(xiàn)
成語接龍大家都玩過,但詩詞填空大家玩過嗎?把成語接龍變成填空題。難度可上漲了不止一個(gè)檔次呢!本文就來用Python和Pygame實(shí)現(xiàn)詩詞填空游戲,需要的可以參考一下2022-12-12

