Python標準庫之zipfile和tarfile模塊的使用
在我們常用的系統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不支持刪除壓縮包中的文件,所以如果有需要刪除壓縮包中的文件,可以將壓縮包解壓出來,然後刪除其中的文件,再壓縮。
到此這篇關於Python標準庫之zipfile和tarfile模塊的使用的文章就介紹到這瞭,更多相關Python zipfile tarfile模塊內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Python3壓縮和解壓縮實現代碼
- Python中zipfile壓縮包模塊的使用
- python中的zip模塊
- Python壓縮包處理模塊zipfile和py7zr操作代碼
- python模塊shutil函數應用示例詳解教程