You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python解压无密码ZIP文件时出现That compression method is not supported报错

Python解压ZIP文件时偶尔报“That compression method is not supported”错误

我用Python编写了一段代码,用于解压当前目录下的无密码ZIP或RAR归档文件,但运行过程中偶尔会抛出**“That compression method is not supported”**的错误,代码时而正常执行、时而失败。相关代码如下:

import rarfile
import sys
import os, zipfile
from tkinter import *
from tkinter import filedialog
from tkinter import messagebox

ZipExtension='.zip'
RarExtension='.rar'
#filesZIP="..\directory"

try:
    os.chdir(filesZIP) # change directory from working dir to dir with files
except:
    messagebox.showerror("Error","The folder with the archives was not selected! Please run the app again and select the folder.")
    sys.exit()


for item in os.listdir(filesZIP):# loop through items in dir
    if item.endswith(ZipExtension): # check for ".zip" extension
        file_name = os.path.abspath(item) # get full path of files
        zip_ref = zipfile.ZipFile(file_name) # create zipfile object
        zip_ref.extractall(filesZIP) # extract file to dir
        zip_ref.close() # close file

for item in os.listdir(filesZIP):
    if item.endswith(RarExtension):
        file_name = os.path.abspath(item)
        rar_ref = rarfile.RarFile(file_name)
        rar_ref.extractall()
        rar_ref.close()


messagebox.showinfo("Information",'Successful!')

问题原因

这个错误的核心是Python标准库zipfile仅支持有限的压缩算法(如DEFLATE、未压缩的STORE格式)。如果处理的ZIP文件使用了其他算法(比如LZMA、BZIP2或一些少见的商业压缩算法),zipfile就会触发该报错。而“时而正常时而失败”的现象,通常是因为你处理的ZIP文件中,部分文件用了zipfile支持的算法,另一部分用了不支持的。

解决方案

方案1:用第三方库支持更多压缩算法

使用pyunpack搭配patool,这两个库能调用系统内置的解压工具(如7-Zip、WinRAR),几乎兼容所有压缩格式和算法。

先安装依赖:

pip install pyunpack patool

修改后的完整代码:

from pyunpack import Archive
import os
import sys
from tkinter import Tk, filedialog, messagebox

ZipExtension = '.zip'
RarExtension = '.rar'

root = Tk()
root.withdraw()
filesZIP = filedialog.askdirectory(title="选择归档文件所在目录")
if not filesZIP:
    messagebox.showerror("错误", "未选择目录!请重新运行程序。")
    sys.exit()

# 先收集所有需要解压的文件,避免重复处理解压后的内容
zip_files = [f for f in os.listdir(filesZIP) if f.endswith(ZipExtension)]
rar_files = [f for f in os.listdir(filesZIP) if f.endswith(RarExtension)]

# 解压ZIP文件
for item in zip_files:
    file_path = os.path.abspath(os.path.join(filesZIP, item))
    try:
        Archive(file_path).extractall(filesZIP)
    except Exception as e:
        messagebox.showwarning("警告", f"解压{item}失败:{str(e)}")

# 解压RAR文件
for item in rar_files:
    file_path = os.path.abspath(os.path.join(filesZIP, item))
    try:
        Archive(file_path).extractall(filesZIP)
    except Exception as e:
        messagebox.showwarning("警告", f"解压{item}失败:{str(e)}")

messagebox.showinfo("提示", "处理完成!")

方案2:升级Python版本并做前置检查

Python 3.11及以上的zipfile新增了对LZMA等算法的支持,若你的Python版本较低,可以尝试升级。另外,在解压前可先检查文件的压缩算法,提前给出提示:

import zipfile
import os
import sys
from tkinter import Tk, filedialog, messagebox

ZipExtension = '.zip'
RarExtension = '.rar'

root = Tk()
root.withdraw()
filesZIP = filedialog.askdirectory(title="选择归档文件所在目录")
if not filesZIP:
    messagebox.showerror("错误", "未选择目录!请重新运行程序。")
    sys.exit()

zip_files = [f for f in os.listdir(filesZIP) if f.endswith(ZipExtension)]

for item in zip_files:
    file_path = os.path.abspath(os.path.join(filesZIP, item))
    try:
        with zipfile.ZipFile(file_path, 'r') as zip_ref:
            # 检查每个文件的压缩算法
            unsupported = []
            for info in zip_ref.infolist():
                if info.compress_type not in zipfile._COMPRESSORS:
                    unsupported.append(f"{info.filename}(算法编号:{info.compress_type})")
            if unsupported:
                msg = f"文件{item}中包含不支持的压缩格式:\n" + "\n".join(unsupported)
                messagebox.showwarning("警告", msg)
                continue
            zip_ref.extractall(filesZIP)
    except zipfile.LZMAError:
        messagebox.showwarning("警告", f"{item}使用了LZMA压缩,请升级Python到3.11+或使用第三方解压库")
    except Exception as e:
        messagebox.showwarning("警告", f"解压{item}出错:{str(e)}")

# RAR解压部分需确保系统安装UnRAR工具
rar_files = [f for f in os.listdir(filesZIP) if f.endswith(RarExtension)]
for item in rar_files:
    file_path = os.path.abspath(os.path.join(filesZIP, item))
    try:
        import rarfile
        with rarfile.RarFile(file_path) as rar_ref:
            rar_ref.extractall(filesZIP)
    except Exception as e:
        messagebox.showwarning("警告", f"解压{item}失败:{str(e)}")

messagebox.showinfo("提示", "处理完成!")

原代码的额外优化点

  1. 原代码中filesZIP变量被注释,导致os.chdir(filesZIP)直接报错,需添加目录选择逻辑。
  2. 原代码解压后会重新遍历目录,可能重复处理刚解压的文件,建议先收集所有目标文件再处理。
  3. RAR解压依赖unrar工具,需确保系统已安装并配置环境变量,否则rarfile库无法正常工作。

内容的提问来源于stack exchange,提问作者GBSH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 22:50:39