Почему я не могу распаковать заархивированный файл с помощью python zip-файла? - PullRequest
0 голосов
/ 09 июля 2020

№1:

def run():
    with open('module1/2020-06-csv.zip', 'rb') as f:
        io = BytesIO(f.read())
    zip_file = zipfile.ZipFile(io)
    zip_buffer = 'module1/myzip.zip'
    my_zip = zipfile.ZipFile(
        zip_buffer,
        mode='w',
        compression=zipfile.ZIP_DEFLATED
    )
    for file in zip_file.filelist:
        if file.filename.endswith('/'):
            continue
        filename = file.filename.split('/')[-1]
        with zip_file.open(file.filename) as f:
            my_zip.writestr(zinfo_or_arcname=filename, data=f.read())

Методом №1 я могу успешно распаковать файл myzip.zip. Но я использовал BytesIO (номер 2) вместо локального файла, и я не могу распаковать файл myzip.zip, что не так?

номер 2

def run():
    with open('module1/2020-06-csv.zip', 'rb') as f:
        io = BytesIO(f.read())
    zip_file = zipfile.ZipFile(io)
    # zip_buffer = 'module1/myzip.zip'
    zip_buffer = BytesIO()
    my_zip = zipfile.ZipFile(
        zip_buffer,
        mode='w',
        compression=zipfile.ZIP_DEFLATED
    )
    for file in zip_file.filelist:
        if file.filename.endswith('/'):
            continue
        filename = file.filename.split('/')[-1]
        with zip_file.open(file.filename) as f:
            my_zip.writestr(zinfo_or_arcname=filename, data=f.read())

    zip_buffer.seek(0)

    with open('module1/myzip.zip', 'wb') as f:
        f.write(zip_buffer.read())

    zip_file.close()
    my_zip.close()

1 Ответ

0 голосов
/ 09 июля 2020

Вы должны позвонить по номеру my_zip.close(), чтобы выходной zip-файл можно было использовать. Вы не показали этого в № 1, но я думаю, что он должен был быть там, если он работал.

В № 2 вы записываете содержимое zip_buffer в файл перед вызовом my_zip.close(), поэтому файл непригоден для использования. Вы позвоните по номеру my_zip.close() позже, но, поскольку вы уже записали содержимое zip_buffer, уже слишком поздно что-либо делать.

Итак, чтобы исправить это, вам просто нужно переместить вызов на my_zip.close() перед записью содержимого zip_buffer в файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...