动态创建zip文件
aiozipstream的Python项目详细描述
AioZipStream公司
这是ZipStream的叉子。简单的python库,用于流式传输ZIP文件,这些文件是动态创建的,不使用任何临时文件。在
- 没有临时文件,数据直接流式传输
- 支持的
deflate
压缩方法 - 内存使用量小,使用yield语句实现traming
- 存档结构是动态创建的,所有数据都可以在流式处理期间创建
- 归档中包含的文件可以使用Python生成器动态生成
- 提供异步AioZipStream和经典ZipStream
- Zip32格式兼容文件
- 独立于python的标准ZipFile实现
- 几乎没有依赖关系:在某些情况下只有
aiofiles
(有关详细信息,请参阅AioZipStream部分) - Zip64支持也计划在将来(远的将来,因为我从未达到过4GB文件大小限制;-)
所需Python版本:
ZipStream
与Python 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}也必须用 请记住,数据应该以合理大小的块来提供,因为在使用stream的情况下, 在流式处理期间,还可以动态生成要流式处理的文件列表: :警告:要使用异步AioZipStream至少需要python3.6版本。AioZipStream使用的是异步生成器语法,它在3.6版本中是可用的。在 要使用本地文件,需要添加 有关 任何用于动态创建数据的生成器都必须定义为 zip流必须在 下面是要发送的文件列表: 启动asyncio循环并将结果流式处理到文件: 有关ZipStream和AioZipStream的完整代码和工作示例,请参见 标签: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'},]
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
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"
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'}]
loop=asyncio.get_event_loop()loop.run_until_complete(zip_async('example.zip',files))loop.stop()
示例
examples
目录。在推荐PyPI第三方库