0

我正在尝试将一个 zipfile(用 BZ2 压缩)解压缩到一个目录中。zipfile 包含多个文件。

所有(我已经看过很多......)示例展示了如何将 zipfile 解压缩到一个文件中。

这是我到目前为止所拥有的:

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)
    
    with open(file=full_zipfile, mode="rb") as zipfile, open(full_target, 'wb') as target:
        decompressor = bz2.BZ2Decompressor()

        for data in iter(lambda : zipfile.read(100*1024), b''):
            target.write(decompressor.decompress(data))

    return

错误是:

Traceback (most recent call last):
  ... (stack) ...
  File "/Users/bert/Project/unzipBzip2.py", line 26, in unzipBzip2
    with open(file=fullzipfile, mode="rb") as zipfile, open(full_target, 'wb') as target:
IsADirectoryError: [Errno 21] Is a directory: '/Users/bert/Project/data/51fba56e-c598-491a-a5e4-57373a59367a'

嗯,“/Users/bert/Project/data/51fba56e-c598-491a-a5e4-57373a59367a”确实是一个目录。这就是应该的,因为解压缩的文件(来自 BZ2 zipfile)应该写在那个目录中。

为什么解压器会抱怨这是一个目录?

如果我将目标更改为文件

    full_target = pathlib.Path(constants.APP.ROOT, constants.DOWNLOAD_FOLDER, passed_targetDir, 'x.x')

它给出了以下错误:

  File "/Users/bert/Project/unzipBzip2.py", line 30, in unzipBzip2
    target.write(decompressor.decompress(data))
OSError: Invalid data stream
4

1 回答 1

0

如果您的 zipfile 是 bz2 压缩 zip,则下面的代码应该可以工作。

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)

    with open(file=full_zipfile, mode="rb") as rawf:
        with bz2.BZ2File(rawf) as bz2f:
            with zipfile.ZipFile(bz2f) as zipf:
                zipf.extractall(full_target)

您可以尝试使用file命令来识别存档格式。例如你的文件是abc.unkown.bz2

$ file ./abc.unkown.bz2
./abc.unkown.bz2: bzip2 compressed data, block size = 900k

现在我们可以使用 bzip2 解压它,得到abc.unkown

$ bzip2 -d ./abc.unkown.bz2

然后继续解压abc.unkown

$ file ./abc.unkown
./abc.unkown: Zip archive data, at least v1.0 to extract

示例文件是zipbz2 内的格式

于 2021-10-26T13:59:53.800 回答