【问题标题】:Python code to recursively create a zip file within a zip file for 'n' iterations用于在 zip 文件中递归创建 zip 文件以进行“n”次迭代的 Python 代码
【发布时间】:2018-12-08 06:38:31
【问题描述】:

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

所以我们最终会得到包含 file2.zip 的 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 等做同样的事情——只是说以防万一我得到任何帮助。

谢谢

【问题讨论】:

    标签: python zip


    【解决方案1】:

    我认为你是对的,这是一个递归任务。

    为此,我将用于创建带有数据的 zip 文件的代码与仅写入(-nother zip-)文件的 zipfile 的代码分开。
    此外,实际将真实文件写入磁盘的代码,不仅是 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,但这是您项目的品味或结构问题。

    【讨论】:

    • 应该提到,我想通过一次写入磁盘在内存中完成这一切
    • 是的,成功了 - 非常感谢。为了与内部 .zip 文件保持一致,我添加了 'zip_file.writestr(filename + str(depth) + ".zip", content)'。现在我需要确保第一个文件(我正在压缩的实际文本)没有 .zip 扩展名。再次感谢
    猜你喜欢
    • 2021-08-13
    • 2019-04-02
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    相关资源
    最近更新 更多