如何解压包含多个文件的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
相关产品推荐
相关产品推荐

