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

如何解压包含多个文件的BZ2压缩包到指定目录并解决相关报错

报错原因解析

第一个报错:IsADirectoryError

  • 核心原因:bz2模块仅负责单个数据流的压缩/解压,本身不具备归档文件的解析能力。你所说的「多文件BZ2压缩包」本质是tar.bz2格式:先将多个文件打包为tar归档,再用bz2算法压缩。你当前代码直接将解压流写入目录路径,而open()函数只能操作文件,不能直接写入目录,因此触发报错。

第二个报错:OSError: Invalid data stream

触发该报错通常有两种可能:

  • 你处理的是多流BZ2文件:部分bz2压缩包会将多个压缩流拼接存储,默认的BZ2Decompressor仅会解压第一个流,遇到后续未识别的流数据就会抛出无效数据流错误。
  • 压缩包本身损坏,或者你读取的文件不是标准bz2格式的文件。
多文件tar.bz2压缩包解压实现

直接使用Python标准库自带的tarfile模块即可,它原生支持读取bz2压缩的tar归档,不需要手动处理解压流和归档解析逻辑,示例代码如下:

import pathlib
import tarfile
import constants

def unzipBzip2(passed_targetDir, passed_zipfile):
    full_zipfile = pathlib.Path(constants.APP.ROOT, constants.DOWNLOAD_FOLDER, passed_zipfile)
    full_target = pathlib.Path(constants.APP.ROOT, constants.DOWNLOAD_FOLDER, passed_targetDir)
    # 自动创建不存在的目标目录
    full_target.mkdir(parents=True, exist_ok=True)
    
    # 以读取bz2压缩tar包的模式打开文件
    with tarfile.open(full_zipfile, mode='r:bz2') as tar:
        # 解压所有文件到目标目录
        tar.extractall(path=full_target)
    
    return

如果确实需要手动处理bz2流(比如适配非tar格式的自定义多文件归档),需要先处理多流解压场景,先得到完整的归档文件后再解析归档内容,参考修改逻辑如下:

import bz2

def decompress_full_bz2(source_path, output_archive_path):
    with open(source_path, 'rb') as src, open(output_archive_path, 'wb') as dst:
        decompressor = bz2.BZ2Decompressor()
        while True:
            data = src.read(100 * 1024)
            if not data:
                break
            try:
                dst.write(decompressor.decompress(data))
            except OSError:
                # 遇到新的压缩流,重新创建解压对象继续处理
                decompressor = bz2.BZ2Decompressor()
                dst.write(decompressor.decompress(data))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 17:54:01