python zip压缩成bytes io
环境
压缩bytes io
import io
import zipfile
from typing import Dict, AnyStr
from zipfile import ZIP_DEFLATED, ZIP_STORED
class FileZip:
def __init__(self):
pass
@staticmethod
def zip2bytes(file_map: Dict[str, AnyStr],
compression=ZIP_DEFLATED,
compresslevel=1,
**kwargs) -> bytes:
"""
将多个文件压缩到一个zip bytes中, 不存本地文件
返回的zip bytes 可被open("test.zip", "wb")写成本地文件
:param file_map: {filename: content} -> {"test.xml": "xxx"}
:param compression: ZIP_DEFLATED zip压缩, ZIP_STORED不压缩
:param compresslevel: 压缩等级, 只在compression=ZIP_DEFLATED时有效
:param kwargs: zipfile.ZipFile
:return: zip bytes
"""
if compression == ZIP_STORED:
compresslevel = None
kwargs["compression"] = compression
kwargs["compresslevel"] = compresslevel
buffer = io.BytesIO()
with zipfile.ZipFile(buffer, "w", **kwargs) as z:
for filename, content in file_map.items():
z.writestr(filename, content)
buffer.seek(0)
return buffer.read()
@staticmethod
def save_file(file: str, data: bytes):
with open(file, "wb") as f:
f.write(data)
if __name__ == '__main__':
files_map = {"test1.txt": "test11111\n" * 100000,
"test2.txt": "test22222"}
zp = FileZip()
zip_data = zp.zip2bytes(files_map, compresslevel=1)
zp.save_file("test.zip", zip_data)