python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python解压各种压缩文件

使用Python解压各种压缩文件的代码实现

作者:detayun

本文介绍通过文件头(Magic Number)识别压缩类型的方法,支持ZIP、TAR、GZ、BZ2、RAR、7Z等格式,需第三方库辅助,并需处理路径安全、大文件流式解压及异常情况,实现更可靠的自动解压方案,需要的朋友可以参考下

在Python中,可以通过检测文件特征自动识别压缩类型并解压。以下是实现方案:

核心原理

通过文件头(Magic Number)判断压缩类型,而非依赖文件扩展名。支持格式包括:ZIP、TAR、GZ、BZ2、RAR、7Z等。

代码实现

import os
import zipfile
import tarfile
import gzip
import bz2
import shutil

def detect_compression(file_path):
    """通过文件头识别压缩类型"""
    with open(file_path, 'rb') as f:
        # ZIP文件检测
        if f.read(4) == b'PK\x03\x04':
            return 'zip'
        # TAR文件检测
        if f.read(261)[257:262] == b'ustar':
            return 'tar'
        # GZ文件检测
        if f.read(2) == b'\x1f\x8b':
            return 'gz'
        # BZ2文件检测
        if f.read(3) == b'BZh':
            return 'bz2'
    return 'unknown'

def extract_archive(archive_path, extract_to='.'):
    """自动解压函数"""
    comp_type = detect_compression(archive_path)
    
    # 根据类型调用对应解压方法
    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')

特殊格式处理

对于RAR/7Z等格式,需安装第三方库:

pip install rarfile py7zr

需在代码中添加:

# 添加在detect_compression函数中
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函数中
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)

注意事项

  1. 文件头检测比扩展名更可靠
  2. 需处理路径安全(避免路径遍历攻击)
  3. 大文件建议使用流式解压
  4. 异常处理需包含文件损坏、权限不足等情况

此方案可自动识别常见压缩格式,对于非常规格式可通过扩展文件头检测逻辑实现支持。

到此这篇关于使用Python解压各种压缩文件的代码实现的文章就介绍到这了,更多相关Python解压各种压缩文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文