使用Python解壓各種壓縮文件的代碼實(shí)現(xiàn)
在Python中,可以通過(guò)檢測(cè)文件特征自動(dòng)識(shí)別壓縮類(lèi)型并解壓。以下是實(shí)現(xiàn)方案:
核心原理
通過(guò)文件頭(Magic Number)判斷壓縮類(lèi)型,而非依賴(lài)文件擴(kuò)展名。支持格式包括:ZIP、TAR、GZ、BZ2、RAR、7Z等。
代碼實(shí)現(xiàn)
import os
import zipfile
import tarfile
import gzip
import bz2
import shutil
def detect_compression(file_path):
"""通過(guò)文件頭識(shí)別壓縮類(lèi)型"""
with open(file_path, 'rb') as f:
# ZIP文件檢測(cè)
if f.read(4) == b'PK\x03\x04':
return 'zip'
# TAR文件檢測(cè)
if f.read(261)[257:262] == b'ustar':
return 'tar'
# GZ文件檢測(cè)
if f.read(2) == b'\x1f\x8b':
return 'gz'
# BZ2文件檢測(cè)
if f.read(3) == b'BZh':
return 'bz2'
return 'unknown'
def extract_archive(archive_path, extract_to='.'):
"""自動(dòng)解壓函數(shù)"""
comp_type = detect_compression(archive_path)
# 根據(jù)類(lèi)型調(diào)用對(duì)應(yīng)解壓方法
if comp_type == 'zip':
with zipfile.ZipFile(archive_path, 'r') as zip_ref:
zip_ref.extractall(extract_to)
elif comp_type == 'tar':
with tarfile.open(archive_path) as tar_ref:
tar_ref.extractall(extract_to)
elif comp_type == 'gz':
with gzip.open(archive_path, 'rb') as gz_ref:
with open(os.path.join(extract_to, os.path.basename(archive_path)[:-3]), 'wb') as out_file:
shutil.copyfileobj(gz_ref, out_file)
elif comp_type == 'bz2':
with bz2.open(archive_path, 'rb') as bz2_ref:
with open(os.path.join(extract_to, os.path.basename(archive_path)[:-4]), 'wb') as out_file:
shutil.copyfileobj(bz2_ref, out_file)
else:
print(f"不支持的壓縮格式: {archive_path}")
# 使用示例
extract_archive('unknown_archive.xyz', './output')
特殊格式處理
對(duì)于RAR/7Z等格式,需安裝第三方庫(kù):
pip install rarfile py7zr
需在代碼中添加:
# 添加在detect_compression函數(shù)中
elif f.read(7) == b'Rar!\x1a\x07\x00':
return 'rar'
elif f.read(6) == b'7z\x00\x00\x00\x00':
return '7z'
# 添加在extract_archive函數(shù)中
elif comp_type == 'rar':
from rarfile import RarFile
with RarFile(archive_path) as rf:
rf.extractall(extract_to)
elif comp_type == '7z':
import py7zr
with py7zr.SevenZipFile(archive_path) as z:
z.extractall(extract_to)
注意事項(xiàng)
- 文件頭檢測(cè)比擴(kuò)展名更可靠
- 需處理路徑安全(避免路徑遍歷攻擊)
- 大文件建議使用流式解壓
- 異常處理需包含文件損壞、權(quán)限不足等情況
此方案可自動(dòng)識(shí)別常見(jiàn)壓縮格式,對(duì)于非常規(guī)格式可通過(guò)擴(kuò)展文件頭檢測(cè)邏輯實(shí)現(xiàn)支持。
到此這篇關(guān)于使用Python解壓各種壓縮文件的代碼實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Python解壓各種壓縮文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用PyCharm和venv進(jìn)行Python項(xiàng)目環(huán)境配置避坑指南
在進(jìn)行 Python 項(xiàng)目開(kāi)發(fā)時(shí),一個(gè)干凈,隔離且配置正確的開(kāi)發(fā)環(huán)境至關(guān)重要,本文結(jié)合之前安裝 Vanna 庫(kù)時(shí)遇到的問(wèn)題,總結(jié)了使用 PyCharm 和 venv 進(jìn)行 Python 項(xiàng)目環(huán)境設(shè)置的最佳實(shí)踐和常見(jiàn)坑的解決方法,有需要的小伙伴可以參考下2025-04-04
python如何實(shí)現(xiàn)從視頻中提取每秒圖片
這篇文章主要為大家詳細(xì)介紹了python如何實(shí)現(xiàn)從視頻中提取每秒圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07
python實(shí)現(xiàn)自動(dòng)更換ip的方法
這篇文章主要介紹了python實(shí)現(xiàn)自動(dòng)更換ip的方法,涉及Python針對(duì)本機(jī)網(wǎng)絡(luò)配置的相關(guān)操作技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-05-05
Python面向?qū)ο蠓庋b繼承和多態(tài)示例講解
這篇文章給大家介紹了python面向?qū)ο蟮娜筇卣鳎悍庋b,繼承,多態(tài)的相關(guān)知識(shí),通過(guò)實(shí)例代碼講解的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2021-04-04
python使用SimpleXMLRPCServer實(shí)現(xiàn)簡(jiǎn)單的rpc過(guò)程
這篇文章主要介紹了python使用SimpleXMLRPCServer實(shí)現(xiàn)簡(jiǎn)單的rpc過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
Python入門(mén)教程(四十)Python的NumPy數(shù)組創(chuàng)建
這篇文章主要介紹了Python入門(mén)教程(四十)Python的NumPy數(shù)組創(chuàng)建,NumPy 用于處理數(shù)組,NumPy 中的數(shù)組對(duì)象稱(chēng)為 ndarray,我們可以使用 array() 函數(shù)創(chuàng)建一個(gè) NumPy ndarray 對(duì)象,需要的朋友可以參考下2023-05-05
Python制作動(dòng)態(tài)字符圖的實(shí)例
今天小編就為大家分享一篇關(guān)于Python制作動(dòng)態(tài)字符圖的實(shí)例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01
python之Flask實(shí)現(xiàn)簡(jiǎn)單登錄功能的示例代碼
這篇文章主要介紹了python之Flask實(shí)現(xiàn)簡(jiǎn)單登錄功能的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12

