接收输入文件和流的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

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
gwt java。lang.UnsupportedClassVersionError:不受支持的专业。小版本51.0   java XML解析器trycatch不工作   java Jackson MRBean不工作,无法构造实例   javascript是检查参数的更好方法吗?   java在发生冲突时从ArrayList中删除对象   JavaSpringWebFlux和KeyClope JWTRESTAPI   java Selected选项在微调器中不可见   java在增加分区后,有没有办法在ApacheKafka中保持顺序?   java添加SourceRoot会导致spring启动应用程序出错   java Spring引导:任何bean都没有实现ReactiveCrudepository   java无法注册我的自定义AbstractAnnotationConfigDispatcherServletInitializer   TCP连接上的java Caesar密码   java树集排序不正确   java如何在自定义查询中加载@ElementCollection?