欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python處理常見格式壓縮包文件的全指南

 更新時間:2025年05月09日 09:50:40   作者:hutaotaotao  
這篇文章主要為大家詳細(xì)介紹了如何使用python處理常見格式壓縮包文件,例如7z壓縮包,tar和gz壓縮包,zip類壓縮包和.rar文件,有需要的小伙伴可以了解下

1.7z壓縮包

安裝py7zr庫

pip install py7zr

解壓.7z文件

以下示例代碼將一次性把"F:/Ticks/test.7z"壓縮文件里面的所有文件一一按照原文件層次結(jié)構(gòu)遞歸解壓到"F:/Ticks/test"目錄下。注意,如果xxx.7z里面包含有壓縮文件,將不會解壓。

import py7zr
 
def un_7z(file_7z_path):
    save_dir = file_7z_path[:file_7z_path.rfind(".7z")]
    archive = py7zr.SevenZipFile(file_7z_path, mode='r')
    archive.extractall(path=save_dir)
    archive.close()
 
if __name__ == "__main__":
    filepath = "F:/Ticks/test.7z"
    un_7z(filepath)

源文件夾目錄結(jié)構(gòu)

解壓后是保持一致的

py7zr (v0.6及更高版本) 也提供了上下文管理,所以可以使用 with 代碼塊:

import py7zr
 
with py7zr.SevenZipFile('sample.7z', mode='r') as z:
    z.extractall()

py7zr 還支持提取單個或通過 extract(targets=[‘file path’]) 選特定的多個文件進(jìn)行解壓。注意:如果只指定文件而不指定父目錄,將會提取失敗。

import py7zr
import re
 
filter_pattern = re.compile(r'<your/target/file_and_directories/regex/expression>')
with SevenZipFile('archive.7z', 'r') as archive:
    allfiles = archive.getnames()
    selective_files = [f for f in allfiles if filter_pattern.match(f)]
    archive.extract(targets=selective_files)

py7zr(v0.6及更高版本)支持提取受密碼保護(hù)的歸檔文件。

import py7zr
 
with py7zr.SevenZipFile('encrypted.7z', mode='r', password='secret') as z:
    z.extractall()

壓縮為.7z文件

下面是一段如何生成歸檔文件的示例代碼

import py7zr
 
with py7zr.SevenZipFile('target.7z', 'w') as archive:
    archive.writeall('/path/to/base_dir', 'base')
 
with py7zr.SevenZipFile('target.7z', 'w') as z:
    z.writeall('./base_dir')

要創(chuàng)建加密存檔,請傳遞密碼

import py7zr
 
with py7zr.SevenZipFile('target.7z', 'w', password='secret') as archive:
    archive.writeall('/path/to/base_dir', 'base')

要使用zstandard等算法創(chuàng)建存檔,可以使用自定義過濾器調(diào)用。

import py7zr
 
my_filters = [{"id": py7zr.FILTER_ZSTD}]
another_filters = [{"id": py7zr.FILTER_ARM}, {"id": py7zr.FILTER_LZMA2, "preset": 7}]
with py7zr.SevenZipFile('target.7z', 'w', filters=my_filter) as archive:
    archive.writeall('/path/to/base_dir', 'base')

7z壓縮包分卷的解壓縮

①分卷長什么樣

正常情況下是把文件夾filename壓縮為filename.7z壓縮包,但7z也提供了用分卷的形式,比如11個分卷

filename.7z.001,filename.7z.002,filename.7z.003,filename.7z.004,.......,filename.7z.011

7z.001這類文件是7z格式文件簡單分割出的

②如何手動解壓分卷形式的壓縮包

要將全部分卷放在同一個目錄下,然后解壓filename.7z.001即可,如果filename.7z.001所在目錄下缺少部分分卷,則會無法解壓或者解壓失敗

③如何將分卷壓縮包合并為7z壓縮包文件

linux環(huán)境下

進(jìn)入分卷所在文件夾,使用指令

cat {文件名1} {文件名2} {文件名n} > {生成文件名}

下以文件名 shapeNetP2M.7z為例,執(zhí)行如下命令:

cat ShapeNetP2M.7z-001.001 ShapeNetP2M.7z-002.002 ShapeNetP2M.7z-003.003 >ShapeNetP2M.7z

[root@localhost 7ztest]# ls
BondTick.7z.001  BondTick.7z.002  BondTick.7z.003  BondTick.7z.004  BondTick.7z.005  BondTick.7z.006  BondTick.7z.007  BondTick.7z.008  BondTick.7z.009  BondTick.7z.010  BondTick.7z.011
[root@localhost 7ztest]# cat * > BondTick.7z

windows環(huán)境下

1、在G:\Downloads\Test目錄中有一批Test.7z.00x分卷壓縮文件(后綴一般為001-00x)。

2、首先使用快捷鍵“Win+R”彈出運(yùn)行命令框,輸入:cmd,打開命令行窗口。

3、輸入:cd /d G:\Downloads\Test,進(jìn)入7z分卷文件目錄中。

4、然后輸入:copy /b test.7z.* test.7z。

5、成功后就會在當(dāng)前目錄看到一個test.7z文件(7z后綴)

2.tar和gz壓縮包

安裝相關(guān)包

Python自帶的tarfile模塊可以方便讀取tar歸檔文件,牛b的是可以處理使用gzip和bz2壓縮歸檔文件tar.gz和tar.bz2。

tarfile包常用函數(shù)

①tarfile.open

創(chuàng)建tar文件對象

tarfile.open(name=None,mode='r',fileobj=None,bufsize=10240,**kwargs)

mode的值有:

  • 'r' or 'r:*'   Open for reading with transparent compression (recommended).
  • 'r:'   Open for reading exclusively without compression.
  • 'r:gz'   Open for reading with gzip compression.
  • 'r:bz2'   Open for reading with bzip2 compression.
  • 'a' or 'a:'   Open for appending with no compression. The file is created if it does not exist.
  • 'w' or 'w:'   Open for uncompressed writing.
  • 'w:gz'   Open for gzip compressed writing.
  • 'w:bz2'   Open for bzip2 compressed writing.

②tar.close()

關(guān)閉文件對象

③tar.add(filepath)

將文件filepath添加到壓縮包文件中

④tar.getnames()

獲取壓縮包里的全部目錄和文件路徑,返回列表,比如壓縮包是linux環(huán)境下的某個壓縮包,壓縮時某個文件路徑是"/home/tick/test/20230510/601669_snap.csv",則返回列表里的某個元素就是"/home/pjzy003/test/20230510/601669_snap.csv"

⑤tar.extract(file_name, target_dir)

將壓縮包文件中的文件file_name解壓到target_dir中,最終解壓后的文件路徑或者目錄路徑為target_dir+file_name

  • 比如target_dir="D:\xxx\yyy",file_name="test\20230510",則新生成的文件夾為"D:\xxx\yyy\test\20230510"
  • 比如target_dir="D:/xxx/yyy",file_name="/home/tick/test/20230510/601669_snap.csv",則新生成的文件為"D:/xxx/yyy/home/tick/test/20230510/601669_snap.csv"

注意:tar.extract函數(shù)的第一個參數(shù)必須傳入tar.getnames()這個函數(shù)返回的列表里的元素

壓縮為tar.gz文件

import os
import tarfile
 
if __name__ == "__main__":
    dir_path = r"D:\PythonTest\20220510"
    tar_gz_path = f"{dir_path}.tar.gz"
    
    # 1.創(chuàng)建tar文件對象
    tar = tarfile.open(tar_gz_path, "w:gz")
    
    # 2.將子目錄和文件添加到tar對象中
    for root, dirs, files in os.walk(dir_path):
        # 2.1先將目錄添加到壓縮包中
        tar.add(root)
        
        # 2.2再將目錄下的文件添加到壓縮包中
        for file in files:
            fullpath = os.path.join(root, file)
            tar.add(fullpath)
    
    # 3.關(guān)閉tar對象
    tar.close()

解壓tar.gz文件

用法示例

import os
import tarfile
 
if __name__ == "__main__":
    tar_gz_path = r"D:\PythonTest\test\20220510.tar.gz"
    # 以下代碼將tar.gz文件解壓到了同級目錄下
    # 比如D:\PythonTest\test\20220510.tar.gz
    # 解壓后產(chǎn)生D:\PythonTest\test\20220510
    
    # 處理路徑信息
    tar_gz_path = tar_gz_path.replace("\\", "/")
    tar_gz_dir = tar_gz_path[:tar_gz_path.rfind("/")]
    tar_gz_name = tar_gz_path[tar_gz_path.rfind("/")+1:]
    dir_name = tar_gz_name[:-7]
    
    # 創(chuàng)建tar文件對象
    tar = tarfile.open(tar_gz_path, "r:gz")
    
    # 獲取壓縮包下的所有子目錄和文件路徑
    file_names = tar.getnames()
    print(file_names)
 
    # 解壓
    for file_name in file_names:
        print("=============")
        print("file_name:", file_name)   
        pre_name = file_name[:file_name.rfind(dir_name)-1]
        print("pre_name:", pre_name)     
        save_dir = tar_gz_dir[:tar_gz_dir.rfind(pre_name)]
        print("save_dir:", save_dir)    
        tar.extract(file_name, save_dir)
    
    # 關(guān)閉tar對象
    tar.close()

將其封裝為函數(shù)。與示例相比,這里的函數(shù)處理了文件路徑的細(xì)節(jié)問題,比如壓縮的路徑"D:\data\20230510.tar.gz",壓縮包里面的文件路徑是"/home/tick/test/20230510/601669_snap.csv",則解壓后的文件路徑是"D:/data/20230510/home/tick/test/20230510/601669_snap.csv",但是我們想要的是"D:/data/20230510/601669_snap.csv"這種效果,因此需要處理,具體見下方代碼。

import os
import shutil
import tarfile
 
def un_tar_gz(gz_file_path):
    """
    :param gz_file_path: tar.gz文件路徑,比如D:/PythonTest/test/20220510.tar.gz
    :return: None
    函數(shù)作用:
        將tar.gz文件解壓到了同級目錄下
        比如D:/PythonTest/test/20220510.tar.gz解壓后產(chǎn)生D:/PythonTest/test/20220510
    """
    # 判斷傳輸?shù)奈募愋褪欠裾_
    if gz_file_path[-7:] != ".tar.gz":
        print(f"{gz_file_path} not tar.gz type")
        return None
    
    # 若文件不存在
    if not os.path.exists(gz_file_path):
        print(f"{gz_file_path} not exists")
        return None
    
    # 處理路徑信息
    tar_gz_path = gz_file_path.replace("\\", "/")
    tar_gz_dir = tar_gz_path[:tar_gz_path.rfind("/")]
    tar_gz_name = tar_gz_path[tar_gz_path.rfind("/") + 1:]
    tar_gz_name_pre = tar_gz_name[:-7]
    save_dir = tar_gz_dir + "/" + tar_gz_name_pre
    save_dir_temp = save_dir + "_temp"
    
    # 創(chuàng)建tar文件對象
    tar = tarfile.open(tar_gz_path, "r:gz")
    
    # 獲取壓縮包下的所有子目錄和文件路徑
    file_names = tar.getnames()
    # print(file_names)
    
    # 解壓,解壓后的文件名為 save_dir + file_name
    for file_name in file_names:
        tar.extract(file_name, save_dir_temp)
    
    # 關(guān)閉tar對象
    tar.close()
    
    # 創(chuàng)建同級目錄
    if not os.path.exists(save_dir):
        os.mkdir(save_dir)
    
    # 將解壓后的文件移動到同級目錄下
    for file_name in file_names:
        temp_file_path = save_dir_temp+"/"+file_name
        start_index = file_name.rfind(tar_gz_name_pre) + len(tar_gz_name_pre)
        final_file_path = save_dir+"/"+file_name[start_index:]
        if not os.path.exists(final_file_path):
            if os.path.isdir(temp_file_path):
                os.mkdir(final_file_path)
            else:
                shutil.move(temp_file_path, final_file_path)
    
    # 刪除臨時目錄
    if os.path.exists(save_dir_temp):
        shutil.rmtree(save_dir_temp)
 
if __name__ == "__main__":
    gz_path = r"D:\PythonTest\test\20220510.tar.gz"
    un_tar_gz(gz_path)

將tar.gz解壓tar文件

import gzip
 
def ungz(filename):
    filename = filename[:-3] 
    # gz文件的單文件解壓就是去掉 filename 后面的 .gz
    gz_file = gzip.GzipFile(filename)
    with open(filename, "w+") as file:
        file.write(gz_file.read())
        return filename  # 這個gzip的函數(shù)需要返回值以進(jìn)一步配合untar函數(shù)

解壓tar文件

import tarfile
 
def untar(filename):
    tar = tarfile.open(filename)
    names = tar.getnames()
    # tar本身是將文件打包,解除打包會產(chǎn)生很多文件,因此需要建立文件夾存放
    if not os.path.isdir(filename + "_dir"):
        os.mkdir(filename + "_dir")
    for name in names:
        tar.extract(name, filename + "_dir/")
    tar.close()

3.zip類壓縮包

使用zipfile模塊

import zipfile
 
def unzip(filename):
    zip_file = zipfile.ZipFile(filename)
    # 類似tar解除打包,建立文件夾存放解壓的多個文件
    if not os.path.isdir(filename + "_dir"):
        os.mkdir(filename + "_dir")
    for names in zip_file.namelist():
        zip_file.extract(names, filename + "_dir/")
    zip_file.close()

4.處理.rar文件

使用rarfile包

import rarfile
import os
 
def unrar(filename):
    rar = rarfile.RarFile(filename)
    if not os.path.isdir(filename + "_dir"):
        os.mkdir(filename + "_dir")
    os.chdir(filename + "_dir")  # 改變當(dāng)前工作路徑
    rar.extractall()   # 將全部文件解壓到當(dāng)前工作路徑
    rar.close()

以上就是python處理常見格式壓縮包文件的全指南的詳細(xì)內(nèi)容,更多關(guān)于python處理壓縮包文件的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • pandas庫中to_datetime()方法的使用解析

    pandas庫中to_datetime()方法的使用解析

    這篇文章主要介紹了pandas庫中to_datetime()方法的使用解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • python 將字符串轉(zhuǎn)換成字典dict的各種方式總結(jié)

    python 將字符串轉(zhuǎn)換成字典dict的各種方式總結(jié)

    下面小編就為大家分享一篇python 將字符串轉(zhuǎn)換成字典dict的各種方式總結(jié),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • python帶參數(shù)打包exe及調(diào)用方式

    python帶參數(shù)打包exe及調(diào)用方式

    今天小編就為大家分享一篇python帶參數(shù)打包exe及調(diào)用方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python進(jìn)行批量剪輯視頻片頭片尾

    Python進(jìn)行批量剪輯視頻片頭片尾

    這篇文章主要為大家詳細(xì)介紹了如何使用Python進(jìn)行批量剪輯視頻片頭片尾功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-01-01
  • python爬蟲實例詳解

    python爬蟲實例詳解

    這篇文章主要為大家詳細(xì)介紹了python爬蟲實例,包括爬蟲技術(shù)架構(gòu),組成爬蟲的關(guān)鍵模塊,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Python中dataclass庫實例詳解

    Python中dataclass庫實例詳解

    這篇文章主要介紹了Python中dataclass庫,合理使用dataclass將會大大減輕開發(fā)中的負(fù)擔(dān),將我們從大量的重復(fù)勞動中解放出來,這既是dataclass的魅力,本文結(jié)合實例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2022-09-09
  • 一文學(xué)會利用python解決文章付費(fèi)限制問題

    一文學(xué)會利用python解決文章付費(fèi)限制問題

    本篇文章主要介紹利用Python爬蟲爬取付費(fèi)文章,適合練習(xí)爬蟲基礎(chǔ)同學(xué),文中描述和代碼示例很詳細(xì),干貨滿滿,感興趣的小伙伴快來一起學(xué)習(xí)吧
    2023-05-05
  • Python編程實現(xiàn)的簡單神經(jīng)網(wǎng)絡(luò)算法示例

    Python編程實現(xiàn)的簡單神經(jīng)網(wǎng)絡(luò)算法示例

    這篇文章主要介紹了Python編程實現(xiàn)的簡單神經(jīng)網(wǎng)絡(luò)算法,結(jié)合實例形式分析了神經(jīng)網(wǎng)絡(luò)算法的原理及Python相關(guān)算法實現(xiàn)技巧,需要的朋友可以參考下
    2018-01-01
  • Python實現(xiàn)功能完整的個人員管理程序

    Python實現(xiàn)功能完整的個人員管理程序

    這篇文章主要介紹了Python實現(xiàn)功能完整的個人員管理程序,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-12-12
  • 如何使用python獲取現(xiàn)在的日期與時間

    如何使用python獲取現(xiàn)在的日期與時間

    學(xué)習(xí)了一段時間的python,不知道大家對于代碼的編寫有了屬于自己的一套思路了呢,下面這篇文章主要給大家介紹了關(guān)于如何使用python獲取現(xiàn)在的日期與時間的相關(guān)資料,需要的朋友可以參考下
    2022-11-11

最新評論