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("提示", "处理完成!")
原代码的额外优化点
- 原代码中
filesZIP变量被注释,导致os.chdir(filesZIP)直接报错,需添加目录选择逻辑。 - 原代码解压后会重新遍历目录,可能重复处理刚解压的文件,建议先收集所有目标文件再处理。
- RAR解压依赖
unrar工具,需确保系统已安装并配置环境变量,否则rarfile库无法正常工作。
内容的提问来源于stack exchange,提问作者GBSH
相关产品推荐
相关产品推荐

