Python-код для рекурсивного создания zip-файла в zip-файле для 'n' итераций - PullRequest
0 голосов
/ 29 июня 2018

Я пытаюсь (и не могу) создать функцию Python, которая, по сути, архивирует некоторый текст, а затем архивирует архив снова и снова (число, основанное на параметре).

Таким образом, мы получим file1.zip, содержащий file2.zip, который, в свою очередь, содержит file3.zip. т.е. (file1.zip (file2.zip (file3.zip))). Надеюсь, это сформулировано достаточно хорошо.

import io
import zipfile
import gzip

hexdata = "5a69702054657374"


def zip_it(filename, depth):
    zip_buffer = io.BytesIO()

    for i in range(0, depth):
        with zipfile.ZipFile(zip_buffer, "a", zipfile.ZIP_DEFLATED, False) as zip_file:
            zip_file.writestr(filename + str(i), bytes.fromhex(hexdata).decode("utf-8"))

    with open(filename + ".zip", "wb") as f:
        f.write(zip_buffer.getvalue())


if __name__ == '__main__':
    zip_it("testfile", 3)

Приведенный выше код - это то, что у меня есть, оно не совсем верно, оно создает 1 сжатый файл с 3 файлами на одном уровне, а не внутри друг друга. Я полагаю, что это рекурсивная проблема.

Кроме того, я бы, вероятно, хотел бы сделать то же самое с gzip, rar и т. Д. - просто сказать на случай, если какие-либо эффекты мне помогут.

Спасибо

1 Ответ

0 голосов
/ 29 июня 2018

Я думаю, вы правы, что это рекурсивное задание.

Для этого я бы отделил код для создания zip-файла с данными из кода, который записывает только zip-файл (-nother zip-) файла.
Кроме того, код для фактической записи реального файла на диск, а не только BytesIO-объектов, должен быть даже вне функции, потому что, как рекурсивная функция, он полностью является частью цикла.

import io
import zipfile

hexdata = "5a69702054657374"


def zip_it(filename, depth):

    zip_buffer = io.BytesIO()

    with zipfile.ZipFile(zip_buffer, "a", zipfile.ZIP_DEFLATED, False) as zip_file:
        if depth > 0:
            content = zip_it(filename, depth - 1)
            fname = 'testZipFile'
            depth = str(depth)
            ext = '.zip'
        else:
            content = bytes.fromhex(hexdata).decode("utf-8")
            fname = 'myTextfile'
            depth = ''
            ext = '.txt'
        zip_file.writestr(fname + depth + ext, content)

    return zip_buffer.getvalue()


if __name__ == '__main__':
    with open("testfile" + ".zip", "wb") as f:
        f.write(zip_it("testfile", 3))

Конечно, вы можете поместить это в другую функцию, например, write_zip(filename), который вызывает zip_it, но это вопрос вкуса или структуры вашего проекта.

...