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

 更新时间:2025年09月12日 08:51:22   作者: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解压各种压缩文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 在dataframe两列日期相减并且得到具体的月数实例

    在dataframe两列日期相减并且得到具体的月数实例

    今天小编就为大家分享一篇在dataframe两列日期相减并且得到具体的月数实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Python抓取京东图书评论数据

    Python抓取京东图书评论数据

    最近接了个项目,需要抓取京东图书的评论,把代码放出来给大家分享下,希望能有所帮助
    2014-08-08
  • Pycharm中flask开启debug模式的详细流程

    Pycharm中flask开启debug模式的详细流程

    PyCharm是一个强大的集成开发环境(IDE),非常适合Python开发者,包括Flask框架,当你在使用Flask开发Web应用时,Debug功能是非常重要的,它允许你在运行时检查程序的状态、调试代码错误,本文将介绍Pycharm中flask开启debug模式的详细流程,需要的朋友可以参考下
    2024-08-08
  • Python实例之wxpython中Frame使用方法

    Python实例之wxpython中Frame使用方法

    本文介绍下wxpython中Frame的用法,不错的python编程实例,有需要的朋友参考下
    2014-06-06
  • Python打包方法之setup.py与pyproject.toml的全面对比与实战

    Python打包方法之setup.py与pyproject.toml的全面对比与实战

    在 Python 开发中,创建可安装的包是分享代码的重要方式,本文将深入解析两种主流打包方法——setup.py 和 pyproject.toml,并通过一个实际项目示例,展示如何使用现代的 pyproject.toml 方法构建、测试和发布 Python 包,需要的朋友可以参考下
    2025-05-05
  • Python如何实现同时进行多个浏览器注入

    Python如何实现同时进行多个浏览器注入

    浏览器注入是一种技术,允许我们在运行中的浏览器进程中注入代码,以便执行特定的任务,下面我们就来看看Python如何实现同时进行多个浏览器注入吧
    2025-03-03
  • 利用Python实现Markdown文档格式转换详解

    利用Python实现Markdown文档格式转换详解

    这篇文章主要介绍了如何利用Python中的MarkItDown库将多种文件高效转换为Markdown文本,以及如何使用Python-Markdown库将Markdown文本转换为HTML,需要的可以参考下
    2025-03-03
  • 浅谈Python Opencv中gamma变换的使用详解

    浅谈Python Opencv中gamma变换的使用详解

    下面小编就为大家分享一篇浅谈Python Opencv中gamma变换的使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • NumPy 基本切片和索引的具体使用方法

    NumPy 基本切片和索引的具体使用方法

    这篇文章主要介绍了NumPy 基本切片和索引的具体使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Python绘制趋势线的示例代码

    Python绘制趋势线的示例代码

    趋势线是用来显示数据趋势或者预测未来发展方向的一种图形表示方法,这篇文章主要为大家详细介绍了如何使用Python绘制趋势线,需要的可以了解下
    2024-03-03

最新评论