在Python中从生成器创建zip文件?

栏目: Python · 发布时间: 7年前

内容简介:我有大量的数据(几个gig),我需要写一个zip文件在Python.我无法一次性将其全部加载到内存中以传递到ZipFile的.writestr方法,而我真的不想使用临时文件将其全部输出到磁盘上,然后将其读回来.有没有办法将生成器或类似文件的对象提供给ZipFile库?还是有一些原因,这种能力似乎不被支持?通过zip文件,我的意思是zip文件.在Python zipfile包中支持.

我有大量的数据(几个gig),我需要写一个zip文件在Python.我无法一次性将其全部加载到内存中以传递到ZipFile的.writestr方法,而我真的不想使用临时文件将其全部输出到磁盘上,然后将其读回来.

有没有办法将生成器或类似文件的对象提供给ZipFile库?还是有一些原因,这种能力似乎不被支持?

通过zip文件,我的意思是zip文件.在Python zipfile包中支持.

唯一的解决方案是重写用于压缩文件以从缓冲区读取的方法.将它添加到标准库中将是微不足道的;我很惊讶,还没有完成.我收集了很多协议,整个接口需要进行大修,似乎阻止了任何增量的改进.
import zipfile, zlib, binascii, struct
class BufferedZipFile(zipfile.ZipFile):
    def writebuffered(self, zipinfo, buffer):
        zinfo = zipinfo

        zinfo.file_size = file_size = 0
        zinfo.flag_bits = 0x00
        zinfo.header_offset = self.fp.tell()

        self._writecheck(zinfo)
        self._didModify = True

        zinfo.CRC = CRC = 0
        zinfo.compress_size = compress_size = 0
        self.fp.write(zinfo.FileHeader())
        if zinfo.compress_type == zipfile.ZIP_DEFLATED:
            cmpr = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION, zlib.DEFLATED, -15)
        else:
            cmpr = None

        while True:
            buf = buffer.read(1024 * 8)
            if not buf:
                break

            file_size = file_size + len(buf)
            CRC = binascii.crc32(buf, CRC) & 0xffffffff
            if cmpr:
                buf = cmpr.compress(buf)
                compress_size = compress_size + len(buf)

            self.fp.write(buf)

        if cmpr:
            buf = cmpr.flush()
            compress_size = compress_size + len(buf)
            self.fp.write(buf)
            zinfo.compress_size = compress_size
        else:
            zinfo.compress_size = file_size

        zinfo.CRC = CRC
        zinfo.file_size = file_size

        position = self.fp.tell()
        self.fp.seek(zinfo.header_offset + 14, 0)
        self.fp.write(struct.pack("<LLL", zinfo.CRC, zinfo.compress_size, zinfo.file_size))
        self.fp.seek(position, 0)
        self.filelist.append(zinfo)
        self.NameToInfo[zinfo.filename] = zinfo

http://stackoverflow.com/questions/297345/create-a-zip-file-from-a-generator-in-python


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

灵活Web设计

灵活Web设计

Zoe Mickley Gillenwater / 李静 / 2009-9 / 45.00元

《灵活Web设计》讲述如何应用可变或不固定布局及弹性布局来实现灵活设计,以满足用户的根据自己需求而调整浏览站点的窗口大小的要求。全书共分为9章,内容包括:理解灵活布局、可变布局和弹性布局存在的挑战、设计灵活布局的方法、准备网页设计、创建可变布局结构、创建弹性布局结构、规范灵活性、设置文字间距、添加背景图像和颜色、创建灵活的图像。 《灵活Web设计》适用于网页设计人员、网页设计爱好者。一起来看看 《灵活Web设计》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

MD5 加密
MD5 加密

MD5 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器