天天看點

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 -- 關閉對象(儲存檔案)

這是我要壓縮的檔案夾。

python常用标準庫(壓縮包子產品zipfile和tarfile)

使用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()
           

可以看到,如果檔案夾直接壓縮的話,不會将其中的檔案一同壓縮。

python常用标準庫(壓縮包子產品zipfile和tarfile)

讓檔案夾中的所有檔案疊代寫入壓縮包中。

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方法并沒有壓縮檔案。

python常用标準庫(壓縮包子產品zipfile和tarfile)
python常用标準庫(壓縮包子產品zipfile和tarfile)

改用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()
           

可以看到,檔案是壓縮寫入内部的。

python常用标準庫(壓縮包子產品zipfile和tarfile)
python常用标準庫(壓縮包子產品zipfile和tarfile)
解壓縮

解壓縮有如下兩種方法,注意,解壓縮就是在讀檔案,要将操作模式變更為

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包壓縮,當然也可以直接将檔案壓縮成為壓縮包。

import tarfile

# tar包以gzip格式壓縮
with tarfile.open('test.tar.gz', 'w:gz') as tf:
    tf.add('test.tar')
           
解壓縮
方法 含義
extract 解壓縮指定檔案
extractall 解壓縮所有檔案
getnames -- 傳回壓縮包中的檔案(list)

删除壓縮包中的檔案

繼續閱讀