python zip压缩成文件和bytes io

python zip压缩成bytes io

环境

  • python==3.8

压缩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)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yuhengshi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值