使用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解压各种压缩文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python绘制散点密度图的三种方式详解

    Python绘制散点密度图的三种方式详解

    散点密度图是在散点图的基础上,计算了每个散点周围分布了多少其他的点,并通过颜色表现出来。本文主要介绍了Python绘制散点密度图的三种方式,需要的可以参考下
    2022-06-06
  • 使用PyCharm和venv进行Python项目环境配置避坑指南

    使用PyCharm和venv进行Python项目环境配置避坑指南

    在进行 Python 项目开发时,一个干净,隔离且配置正确的开发环境至关重要,本文结合之前安装 Vanna 库时遇到的问题,总结了使用 PyCharm 和 venv 进行 Python 项目环境设置的最佳实践和常见坑的解决方法,有需要的小伙伴可以参考下
    2025-04-04
  • python如何实现从视频中提取每秒图片

    python如何实现从视频中提取每秒图片

    这篇文章主要为大家详细介绍了python如何实现从视频中提取每秒图片,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • python实现自动更换ip的方法

    python实现自动更换ip的方法

    这篇文章主要介绍了python实现自动更换ip的方法,涉及Python针对本机网络配置的相关操作技巧,非常具有实用价值,需要的朋友可以参考下
    2015-05-05
  • Python面向对象封装继承和多态示例讲解

    Python面向对象封装继承和多态示例讲解

    这篇文章给大家介绍了python面向对象的三大特征:封装,继承,多态的相关知识,通过实例代码讲解的非常详细,感兴趣的朋友跟随小编一起看看吧
    2021-04-04
  • python使用SimpleXMLRPCServer实现简单的rpc过程

    python使用SimpleXMLRPCServer实现简单的rpc过程

    这篇文章主要介绍了python使用SimpleXMLRPCServer实现简单的rpc过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Python入门教程(四十)Python的NumPy数组创建

    Python入门教程(四十)Python的NumPy数组创建

    这篇文章主要介绍了Python入门教程(四十)Python的NumPy数组创建,NumPy 用于处理数组,NumPy 中的数组对象称为 ndarray,我们可以使用 array() 函数创建一个 NumPy ndarray 对象,需要的朋友可以参考下
    2023-05-05
  • Python制作动态字符图的实例

    Python制作动态字符图的实例

    今天小编就为大家分享一篇关于Python制作动态字符图的实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • Python tkinter 列表框Listbox属性详情

    Python tkinter 列表框Listbox属性详情

    这篇文章主要介绍了Python tkinter 列表框Listbox属性详情,列表框控件显示多行文本,用户可以选中一行或者多行。所有的文本只能使用一种字体,不能混合使用多种字体
    2022-07-07
  • python之Flask实现简单登录功能的示例代码

    python之Flask实现简单登录功能的示例代码

    这篇文章主要介绍了python之Flask实现简单登录功能的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12

最新评论