Python代码在zip文件中递归地创建一个zip文件,用于“n”次迭代

2024-03-29 08:14:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试(但失败了)创建一个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等做同样的处理——只是说万一我得到任何帮助的话。你知道吗

谢谢


Tags: 函数ioimportbufferwithitzipfilename
1条回答
网友
1楼 · 发布于 2024-03-29 08:14:20

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

为此,我将创建一个包含数据的zip文件的代码与只编写一个(另一个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,但这取决于您的项目的品味或结构。你知道吗

相关问题 更多 >