Python代码,用于在';n';迭代

Python代码,用于在';n';迭代,python,zip,Python,Zip,我正在尝试(但失败)创建一个Python函数,该函数本质上是对一些文本进行压缩,然后一次又一次地压缩归档文件(基于参数的数字) 因此,我们最终得到的file1.zip包含file2.zip,而file2.zip又包含file3.zip。i、 e(file1.zip(file2.zip(file3.zip)))。希望这一点表达得足够清楚 import io import zipfile import gzip hexdata = "5a69702054657374" def zip_it(f

我正在尝试(但失败)创建一个Python函数,该函数本质上是对一些文本进行压缩,然后一次又一次地压缩归档文件(基于参数的数字)

因此,我们最终得到的file1.zip包含file2.zip,而file2.zip又包含file3.zip。i、 e(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)
上面的代码是我到目前为止所拥有的,它并不完全正确,它创建了一个压缩文件,其中3个文件都在同一级别,而不是彼此之间。我认为这是一个递归问题

另外,我可能也想对gzip、rar等做同样的处理——只是说万一我得到任何帮助


谢谢

我想你是对的,这是一项递归任务

为此,我将使用数据创建zip文件的代码与只编写(-另一个zip-)文件的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\u-zip(filename)
,它调用
zip\u-it
,但这是一个关于你的项目的品味或结构的问题。

应该提到的是,我想通过一次对磁盘的写入在内存中完成这一切是的,这就完成了这个技巧-非常感谢。为了保持与内部.zip文件的一致性,我添加了'zip_file.writestr(filename+str(depth)+“.zip”,content')。现在我需要确保第一个文件(我正在压缩的实际文本)没有.zip扩展名。再次感谢