内容简介:我有大量的数据(几个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
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Node.js开发实战
[美] Jim R. Wilson / 梅晴光、杜万智、陈琳、纪清华、段鹏飞 / 华中科技大学出版社 / 2018-11-10 / 99.90元
2018年美国亚马逊书店排名第一的Node.js开发教程。 . Node.js是基于Chrome V8引擎的JavaScript运行环境,它采用事件驱动、非阻塞式I/O模型,具有轻量、高效的特点。Node.j s 工作在前端代码与 数据存储层之间,能够提高web应用的工作效率和 响应速度。本书以最新版Node.js 8为基础,从实际案例出发 讲解Node.js的核心工作原理和实用开发技......一起来看看 《Node.js开发实战》 这本书的介绍吧!