内容简介:我有大量的数据(几个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
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
奇点系列
彼得•蒂尔、里德•霍夫曼、本•霍洛维茨、埃里克•杰克逊等 / 高玉芳、路蒙佳、杨晓红、徐彬等 / 中信出版社 / 2015-6-20 / 182.00
1.硅谷创投教父、PayPal创始人彼得•蒂尔、LinkedIn创始人里德•霍夫曼、创业导师本•霍洛维茨、“PayPal黑帮”初创成员埃里克•杰克逊联合作品。 2.彼得•蒂尔与埃隆•马斯克的首次交锋,PayPal从0到1改变全球金融的生死突围,商业硬汉的创业史诗,揭秘“PayPal黑帮”的创业维艰与联盟关系。 3.《人民日报》推荐创业者必读书目!“奇点系列”的作者们以及“PayPal黑......一起来看看 《奇点系列》 这本书的介绍吧!