动态创建zip文件

aiozipstream的Python项目详细描述


AioZipStream公司

这是ZipStream的叉子。简单的python库,用于流式传输ZIP文件,这些文件是动态创建的,不使用任何临时文件。在

  • 没有临时文件,数据直接流式传输
  • 支持的deflate压缩方法
  • 内存使用量小,使用yield语句实现traming
  • 存档结构是动态创建的,所有数据都可以在流式处理期间创建
  • 归档中包含的文件可以使用Python生成器动态生成
  • 提供异步AioZipStream和经典ZipStream
  • Zip32格式兼容文件
  • 独立于python的标准ZipFile实现
  • 几乎没有依赖关系:在某些情况下只有aiofiles(有关详细信息,请参阅AioZipStream部分)
  • Zip64支持也计划在将来(远的将来,因为我从未达到过4GB文件大小限制;-)

所需Python版本:

ZipStreamPython 2.7兼容。在

AioZipStream需要Python 3.6。对于早期版本,AioZipStream不可导入。在

用法:

要存档的文件列表存储为dict列表。为什么是dicts?因为每个文件都可能有额外的参数,以后还会计划更多的参数。在

要存档的文件的示例列表:

files=[# file /tmp/file.dat will be added to archive under `file.dat` name.{'file':'/tmp/file.dat'},# same file as previous under own name: `completly_different.foo`# and will be compressed using `deflate` compression method{'file':'/tmp/file.dat','name':'completly_different.foo','compression':'deflate'}]

是时候进行流式传输/归档了:

^{pr2}$

任何iterable二进制数据源都可以用来代替常规文件。{{{cd7}也必须用

defsource_of_bytes():yieldb"123456789"yieldb"abcdefgh"yieldb"I am a binary data"files=[....# file will be generated dynamically under name my_data.bin{'stream':source_of_bytes(),'name':'my_data.bin'},]

请记住,数据应该以合理大小的块来提供,因为在使用stream的情况下,ZipStream类无法自行分割数据。在

在流式处理期间,还可以动态生成要流式处理的文件列表:

importosfromzipstreamimportZipStreamdeffiles_to_stream_with_foo_in_name(dirname):# all files from selected firectoryforfinos.listdir(dirname):fp=os.path.join(dirname,f)ifos.path.isfile(fp):yield{'file':fp,'name':"foo_"+os.path.basename(fp)}# and our generator tooyield{'stream':source_of_bytes(),'name':'my_data.bin','compression':'deflate'}zs=ZipStream(files_to_stream_with_foo_in_name('\tmp\some-files'))

异步AioZipStream

:警告:要使用异步AioZipStream至少需要python3.6版本。AioZipStream使用的是异步生成器语法,它在3.6版本中是可用的。在

要使用本地文件,需要添加aiofiles库。如果您计划仅流式传输动态生成的内容,则不需要aiofiles。在

有关aiofiles的详细信息,请参见aiofiles github repo。在

异步压缩流示例

任何用于动态创建数据的生成器都必须定义为async

asyncdefcontent_generator():yieldb'foo baz'asyncio.sleep(0.1)# we simulate little slow source of datadata=awaitremote_data_source()yieldbytes(data,'utf-8')# always remember to yield binary dataasyncio.sleep(0.5)yieldb"the end"

zip流必须在async函数内。注意使用aiofiles.open而不是{},这是异步的,在磁盘访问期间不会阻塞事件循环。在

fromzipstreamimportAioZipStreamasyncdefzip_async(zipname,files):aiozip=AioZipStream(files,chunksize=32768)asyncwithaiofiles.open(zipname,mode='wb')asz:asyncforchunkinaiozip.stream():awaitz.write(chunk)

下面是要发送的文件列表:

files=[{'file':'/tmp/car.jpeg'},{'file':'/tmp/aaa.mp3','name':'music.mp3'},{'stream':content_generator(),'name':'random_stuff.txt'}]

启动asyncio循环并将结果流式处理到文件:

loop=asyncio.get_event_loop()loop.run_until_complete(zip_async('example.zip',files))loop.stop()

示例

有关ZipStream和AioZipStream的完整代码和工作示例,请参见examples目录。在

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

推荐PyPI第三方库


热门话题
java两个构造函数?   java for(inti:x)做什么?   java如何将一个bean的构造函数参数传递给嵌套bean   java从易趣链接提取项目ID   java多线程BufferedReader   安卓全新应用程序在R.java中抛出“语法错误,插入“}”以完成类体”   java Spring启动依赖注入请求范围的bean   java给定的时间,然后约定和异常处理。和莫基托和朱尼特在一起   与Android Studio的java Oracle数据库连接   在web服务器(Heroku)上承载可运行jar文件(Discord bot)的java   java如何每隔n秒在imageview中更改图像   java不理解“volatile”关键字   java使用JPA编写自定义SQL查询   java如何使用filechannel作为参数来编写对象