python處理常見格式壓縮包文件的全指南
1.7z壓縮包
安裝py7zr庫(kù)
pip install py7zr
解壓.7z文件
以下示例代碼將一次性把"F:/Ticks/test.7z"壓縮文件里面的所有文件一一按照原文件層次結(jié)構(gòu)遞歸解壓到"F:/Ticks/test"目錄下。注意,如果xxx.7z里面包含有壓縮文件,將不會(huì)解壓。
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 還支持提取單個(gè)或通過 extract(targets=[‘file path’]) 選特定的多個(gè)文件進(jìn)行解壓。注意:如果只指定文件而不指定父目錄,將會(huì)提取失敗。
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')
要?jiǎng)?chuàng)建加密存檔,請(qǐ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壓縮包分卷的解壓縮
①分卷長(zhǎng)什么樣
正常情況下是把文件夾filename壓縮為filename.7z壓縮包,但7z也提供了用分卷的形式,比如11個(gè)分卷
filename.7z.001,filename.7z.002,filename.7z.003,filename.7z.004,.......,filename.7z.011
7z.001這類文件是7z格式文件簡(jiǎn)單分割出的
②如何手動(dòng)解壓分卷形式的壓縮包
要將全部分卷放在同一個(gè)目錄下,然后解壓filename.7z.001即可,如果filename.7z.001所在目錄下缺少部分分卷,則會(huì)無法解壓或者解壓失敗
③如何將分卷壓縮包合并為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、成功后就會(huì)在當(dāng)前目錄看到一個(gè)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文件對(duì)象
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)閉文件對(duì)象
③tar.add(filepath)
將文件filepath添加到壓縮包文件中
④tar.getnames()
獲取壓縮包里的全部目錄和文件路徑,返回列表,比如壓縮包是linux環(huán)境下的某個(gè)壓縮包,壓縮時(shí)某個(gè)文件路徑是"/home/tick/test/20230510/601669_snap.csv",則返回列表里的某個(gè)元素就是"/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ù)的第一個(gè)參數(shù)必須傳入tar.getnames()這個(gè)函數(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文件對(duì)象
tar = tarfile.open(tar_gz_path, "w:gz")
# 2.將子目錄和文件添加到tar對(duì)象中
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對(duì)象
tar.close()
解壓tar.gz文件
用法示例
import os
import tarfile
if __name__ == "__main__":
tar_gz_path = r"D:\PythonTest\test\20220510.tar.gz"
# 以下代碼將tar.gz文件解壓到了同級(jí)目錄下
# 比如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文件對(duì)象
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對(duì)象
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文件解壓到了同級(jí)目錄下
比如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文件對(duì)象
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對(duì)象
tar.close()
# 創(chuàng)建同級(jí)目錄
if not os.path.exists(save_dir):
os.mkdir(save_dir)
# 將解壓后的文件移動(dòng)到同級(jí)目錄下
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)
# 刪除臨時(shí)目錄
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 # 這個(gè)gzip的函數(shù)需要返回值以進(jìn)一步配合untar函數(shù)
解壓tar文件
import tarfile
def untar(filename):
tar = tarfile.open(filename)
names = tar.getnames()
# tar本身是將文件打包,解除打包會(huì)產(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解除打包,建立文件夾存放解壓的多個(gè)文件
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處理壓縮包文件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
pandas庫(kù)中to_datetime()方法的使用解析
這篇文章主要介紹了pandas庫(kù)中to_datetime()方法的使用解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
python 將字符串轉(zhuǎn)換成字典dict的各種方式總結(jié)
下面小編就為大家分享一篇python 將字符串轉(zhuǎn)換成字典dict的各種方式總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-03-03
python帶參數(shù)打包exe及調(diào)用方式
今天小編就為大家分享一篇python帶參數(shù)打包exe及調(diào)用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-12-12
Python中dataclass庫(kù)實(shí)例詳解
這篇文章主要介紹了Python中dataclass庫(kù),合理使用dataclass將會(huì)大大減輕開發(fā)中的負(fù)擔(dān),將我們從大量的重復(fù)勞動(dòng)中解放出來,這既是dataclass的魅力,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2022-09-09
一文學(xué)會(huì)利用python解決文章付費(fèi)限制問題
本篇文章主要介紹利用Python爬蟲爬取付費(fèi)文章,適合練習(xí)爬蟲基礎(chǔ)同學(xué),文中描述和代碼示例很詳細(xì),干貨滿滿,感興趣的小伙伴快來一起學(xué)習(xí)吧2023-05-05
Python編程實(shí)現(xiàn)的簡(jiǎn)單神經(jīng)網(wǎng)絡(luò)算法示例
這篇文章主要介紹了Python編程實(shí)現(xiàn)的簡(jiǎn)單神經(jīng)網(wǎng)絡(luò)算法,結(jié)合實(shí)例形式分析了神經(jīng)網(wǎng)絡(luò)算法的原理及Python相關(guān)算法實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-01-01
Python實(shí)現(xiàn)功能完整的個(gè)人員管理程序
這篇文章主要介紹了Python實(shí)現(xiàn)功能完整的個(gè)人員管理程序,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-12-12
如何使用python獲取現(xiàn)在的日期與時(shí)間
學(xué)習(xí)了一段時(shí)間的python,不知道大家對(duì)于代碼的編寫有了屬于自己的一套思路了呢,下面這篇文章主要給大家介紹了關(guān)于如何使用python獲取現(xiàn)在的日期與時(shí)間的相關(guān)資料,需要的朋友可以參考下2022-11-11

