溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

python標(biāo)準(zhǔn)庫壓縮包模塊zipfile和tarfile怎么使用

發(fā)布時間:2022-06-16 13:49:31 來源:億速云 閱讀:183 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“python標(biāo)準(zhǔn)庫壓縮包模塊zipfile和tarfile怎么使用”的相關(guān)知識,小編通過實(shí)際案例向大家展示操作過程,操作方法簡單快捷,實(shí)用性強(qiáng),希望這篇“python標(biāo)準(zhǔn)庫壓縮包模塊zipfile和tarfile怎么使用”文章能幫助大家解決問題。

    常用的標(biāo)準(zhǔn)庫

    在我們常用的系統(tǒng)windowsLinux系統(tǒng)中有很多支持的壓縮包格式,包括但不限于以下種類:rar、zip、tar,以下的標(biāo)準(zhǔn)庫的作用就是用于壓縮解壓縮其中一些格式的壓縮包。

    zip格式

    import zipfile

    zipfile模塊操作壓縮包使用ZipFile類進(jìn)行操作,使用方法和open的使用方法很相似,也是使用r、w、xa四種操作模式?;静襟E也是大致分為三步:打開文件、操作文件、關(guān)閉文件??梢允褂脀ith語法進(jìn)行上下文自動操作。

    注意一:zipfile也是rwxa四種模式,表示也會有文件操作中光標(biāo)指針的概念。

    注意二:在Python中,幾乎所有涉及到文件相關(guān)的操作都是打開、操作、關(guān)閉三個步驟。

    ZipFile參數(shù)說明

    語法:ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True)

    參數(shù)含義
    file文件路徑
    mode操作含義,與文件操作中相同,默認(rèn)為r。
    compression壓縮方法,默認(rèn)為ZIP_STORED。
    allowZip64操作的壓縮包文件大小大于2G時應(yīng)該True, 默認(rèn)為True,不用管它。
    操作含義
    模式含義
    w創(chuàng)建一個新的壓縮包文件。
    r讀取已有的壓縮包文件。
    a向已有的壓縮包文件中壓縮文件。
    壓縮方法

    在上面的compression參數(shù)中可以看到,默認(rèn)的壓縮方法為ZIP_STORED。其實(shí)在zipfile模塊中定義了一些壓縮方法常量,其中最常用的為以下兩種:

    ZIP_STORED = 0  # 打包歸檔(不壓縮)
    ZIP_DEFLATED = 8  # 壓縮文件(壓縮)

    注意,壓縮方法指的是將文件寫入壓縮包中采用的方法,所以,如果是解壓縮文件,就沒必要指定這個壓縮方法了。

    常用方法
    write -- 指定文件寫入壓縮包(壓縮文件)

    語法:write(filename, arcname=None)

    語法:write(壓縮文件路徑,寫入壓縮包后的路徑和名字(默認(rèn)原名))

    寫入文件如果是文件夾,那么不會將文件夾中的內(nèi)容一同寫入。

    close -- 關(guān)閉對象(保存文件)

    這是我要壓縮的文件夾。

    python標(biāo)準(zhǔn)庫壓縮包模塊zipfile和tarfile怎么使用

    使用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')
    
    # 寫入文件(文件夾的話,不會將文件夾中的文件一同寫入)
    zf.write(file_path)
    
    # 關(guān)閉文件
    zf.close()

    可以看到,如果文件夾直接壓縮的話,不會將其中的文件一同壓縮。

    python標(biāo)準(zhǔn)庫壓縮包模塊zipfile和tarfile怎么使用

    讓文件夾中的所有文件迭代寫入壓縮包中。

    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')
    # 寫入文件(自定義一個函數(shù),迭代壓縮文件夾)
    writeZip(zf, file_path)
    # 關(guān)閉文件
    zf.close()

    現(xiàn)在就可以看到,雖然所有的文件已經(jīng)全部寫入壓縮包中,但是ZIP_STORED方法并沒有壓縮文件。

    python標(biāo)準(zhǔn)庫壓縮包模塊zipfile和tarfile怎么使用

    python標(biāo)準(zhǔn)庫壓縮包模塊zipfile和tarfile怎么使用

    改用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)
    # 寫入文件(自定義一個函數(shù),迭代壓縮文件夾)
    writeZip(zf, file_path)
    # 關(guān)閉文件
    zf.close()

    可以看到,文件是壓縮寫入內(nèi)部的。

    python標(biāo)準(zhǔn)庫壓縮包模塊zipfile和tarfile怎么使用

    python標(biāo)準(zhǔn)庫壓縮包模塊zipfile和tarfile怎么使用

    解壓縮

    解壓縮有如下兩種方法,注意,解壓縮就是在讀文件,要將操作模式變更為r。

    方法說明
    extract解壓縮單個指定的文件。
    extractall解壓縮所有的文件。

    語法:extract(member,path=None, pwd=None)

    語法:extract(指定文件(壓縮包中的路徑),解壓到的位置(默認(rèn)為當(dāng)前工作目錄),指定的密碼(有些壓縮包有密碼,格式為字節(jié)流))

    語法:extractall(path=None, pwd=None)

    語法:extractall(解壓到的位置, 密碼)

    注意:解壓文件和路徑中的文件夾同名會報錯,因?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í)的時候,老師還教有encoding='UTF-8'參數(shù),但是文件操作要什么編碼格式?感覺他是為了方便直接從文件操作的代碼上直接復(fù)制過來的,然后沒有刪掉。

    操作tar包

    模式為r、wa、x四種為主,外加使用add方法寫入文件,退出依然使用close方法。

    add(name, arcname)

    add(壓縮文件,壓縮別名)

    注意,壓縮別名一定不要以路徑分隔符為結(jié)尾,否則只會創(chuàng)建一個文件夾。

    import tarfile
    with tarfile.open('test.tar', 'w') as tf:
        tf.add('test.txt')
    壓縮

    壓縮的方式主要是將模式改變,在rwx的基礎(chǔ)上加上各個壓縮的方式,變成:r:gzw: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不支持刪除壓縮包中的文件,所以如果有需要刪除壓縮包中的文件,可以將壓縮包解壓出來,然后刪除其中的文件,再壓縮。

    關(guān)于“python標(biāo)準(zhǔn)庫壓縮包模塊zipfile和tarfile怎么使用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點(diǎn)。

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI