Python创建压缩文件

9

我使用以下脚本创建ZIP文件:

import zipfile
import os

def zip_file_generator(filenames, size):

    # filenames = path to the files

    zip_subdir = "SubDirName"
    zip_filename = "SomeName.zip"

    # Open BytesIO to grab in-memory ZIP contents
    s = io.BytesIO()

    # The zip compressor
    zf = zipfile.ZipFile(s, "w")

    for fpath in filenames:
        # Calculate path for file in zip
        fdir, fname = os.path.split(fpath)
        zip_path = os.path.join(zip_subdir, fname)

        # Add file, at correct path
        zf.write(fpath, zip_path)

    # Must close zip for all contents to be written
    zf.close()

    # Grab ZIP file from in-memory, make response with correct MIME-type
    resp = HttpResponse(s.getvalue(), content_type = "application/x-zip-compressed")
    # ..and correct content-disposition
    resp['Content-Disposition'] = 'attachment; filename=%s' % zip_filename
    resp['Content-length'] = size

    return resp

我从这里得到了它。

但是,由于我使用的是Python 3.x,我将s = StringIO.StringIO()更改为s = io.BytesIO()

zip文件确实以正确的大小等创建,但我无法打开它。它是无效的。如果我将zip文件写入磁盘,则zip文件有效。


@MalikBrahimi,很抱歉,我不理解你的问题。 - gaba
@MalikBrahimi:gaba 正在尝试将 zip 数据写入s - PM 2Ring
奇怪。我刚刚测试了你代码中的zip部分(在Python 2.6.6上),将s.getvalue()写入二进制文件并保存到磁盘,对我来说它可以正常工作。 - PM 2Ring
刚刚让它工作了(看看我的答案)。谢谢大家 :) - gaba
2个回答

3

我搞定了。只需将 resp['Content-length'] = size 中的 size 改为 s.tell()


1
现在有意义了。是的,“Content-length”需要是您发送的实际数据的大小,而不是压缩前的大小。 - PM 2Ring
@PM2Ring 是的。谢谢您的解释。 - gaba
抱歉,对我来说它不起作用。压缩文件有内容,但我无法解压缩。 - davyria

1

我使用shutil进行如下压缩:

import shutil
shutil.make_archive(archive_name, '.zip', folder_name)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接