接收输入文件和流的zipfile生成器
zipstream-new的Python项目详细描述
python zipstream
py是一个基于python 3.3的zipfile.py的zip存档生成器。它是为了 为流媒体(IE Web应用)生成ZIP文件生成器。这对你 希望提供一个可下载的常规文件的大集合的存档,这对于 在下载之前生成存档文件,或者生成不希望完全存储在磁盘或内存中的非常大的文件。
存档文件是作为字符串的迭代器生成的,当连接时,它将形成 压缩文件。例如,下面的代码片段将编写一个zip 包含从“path”到普通文件的文件的存档:
importzipstreamz=zipstream.ZipFile()z.write('path/to/files')withopen('zipfile.zip','wb')asf:fordatainz:f.write(data)
zipstream还允许将字节字符串iterable作为输入,并生成 作为迭代器的存档。 这样可以避免在磁盘或内存中存储大文件。 为此,您可以使用以下代码片段:
defiterable():for_inxrange(10):yieldb'this is a byte string\x01\n'z=zipstream.ZipFile()z.write_iter('my_archive_iter',iterable())withopen('zipfile.zip','wb')asf:fordatainz:f.write(data)
当然,这两种方法都可以结合起来:
defiterable():for_inxrange(10):yieldb'this is a byte string\x01\n'z=zipstream.ZipFile()z.write('path/to/files','my_archive_files')z.write_iter('my_archive_iter',iterable())withopen('zipfile.zip','wb')asf:fordatainz:f.write(data)
因为web.py的最新版本支持将字符串的迭代器返回为 发送到浏览器,下载动态生成的存档,您可以 使用类似于此片段的内容:
defGET(self):path='/path/to/dir/of/files'zip_filename='files.zip'web.header('Content-type','application/zip')web.header('Content-Disposition','attachment; filename="%s"'%(zip_filename,))returnzipstream.ZipFile(path)
如果zlib模块可用,zipstream.zipfile可以生成压缩的zip 档案。
安装
pip install zipstream-new
要求
- python 2.6+、3.2+、pypy
示例
烧瓶
fromflaskimportResponse@app.route('/package.zip',methods=['GET'],endpoint='zipball')defzipball():defgenerator():z=zipstream.ZipFile(mode='w',compression=ZIP_DEFLATED)z.write('/path/to/file')forchunkinz:yieldchunkresponse=Response(generator(),mimetype='application/zip')response.headers['Content-Disposition']='attachment; filename={}'.format('files.zip')returnresponse# or@app.route('/package.zip',methods=['GET'],endpoint='zipball')defzipball():z=zipstream.ZipFile(mode='w',compression=ZIP_DEFLATED)z.write('/path/to/file')response=Response(z,mimetype='application/zip')response.headers['Content-Disposition']='attachment; filename={}'.format('files.zip')returnresponse# Partial flushing of the zip before closing@app.route('/package.zip',methods=['GET'],endpoint='zipball')defzipball():defgenerate_zip_with_manifest():z=zipstream.ZipFile(mode='w',compression=ZIP_DEFLATED)manifest=[]forfilenameinos.listdir('/path/to/files'):z.write(os.path.join('/path/to/files',filename),arcname=filename)yield fromz.flush()manifest.append(filename)z.write_str('manifest.json',json.dumps(manifest).encode())yield fromzresponse=Response(z,mimetype='application/zip')response.headers['Content-Disposition']='attachment; filename={}'.format('files.zip')returnresponse
django 1.5+
fromdjango.httpimportStreamingHttpResponsedefzipball(request):z=zipstream.ZipFile(mode='w',compression=ZIP_DEFLATED)z.write('/path/to/file')response=StreamingHttpResponse(z,content_type='application/zip')response['Content-Disposition']='attachment; filename={}'.format('files.zip')returnresponse
韦比
defGET(self):path='/path/to/dir/of/files'zip_filename='files.zip'web.header('Content-type','application/zip')web.header('Content-Disposition','attachment; filename="%s"'%(zip_filename,))returnzipstream.ZipFile(path)
运行测试
对于python版本>;2.6,只需运行以下命令:python -m unittest discover
或者,可以使用nose
。