Python压缩解压zip,Django下载zip文件

Python压缩解压zip

  • 压缩

    import zipfile
    def convert_zip(zip_path, save_path):
        '''
        # zip_path 要压缩文件的路径
        # save_path 文件压缩后保存的路径
        '''
        local_path = os.path.join(zip_path, "x.xls")
        zip = zipfile.ZipFile(save_path, "w")  #  zipfile.ZIP_DEFLATED
        zip.write(local_path, 'x.xls')
        zip.close()
    
    convert_zip(zip_path, save_path)
    
  • 解压缩

    def unzip(file_path, save_path):
        """ 
        zip文件解压缩 
        :param file_path: 要解压的文件
        :param save_path: 解压后的文件保存目录
        """
        zfile = zipfile.ZipFile(file_path)
        for filename in zfile.namelist():
            data = zfile.read(filename)
            f = open(os.path.join(save_path, filename), 'w+b')
            f.write(data)
            f.close()
    

Django下载zip文件

  • Django使用临时文件夹tempfile下载其他文件,并压缩为zip文件返回给前端

  • 使用BytesIO()tempfile下载

    import io
    def contract_download(download_urls):
        '''
        downloads_urls 要批量下载并且压缩的文件
        '''
        # 创建BytesIO
        s = io.BytesIO()
        # 创建一个临时文件夹用来保存下载的文件
        temp = tempfile.TemporaryDirectory()
        # 使用BytesIO生成压缩文件
        zip = zipfile.ZipFile(s, 'w')
        for i in download_urls:
            f_name = "{}.pdf".format(i['name'])
            local_path = os.path.join(temp.name, f_name)
            # 下载文件
            ur.urlretrieve(i['download_url'], local_path)
            # 把下载文件的写入压缩文件
            zip.write(local_path, f_name)
        # 关闭文件
        zip.close()
        # 指针回到初始位置,没有这一句前端得到的zip文件会损坏
        s.seek(0)
        # 用FileWrapper类来迭代器化一下文件对象,实例化出一个经过更适合大文件下载场景的文件对象,实现原理相当与把内容一点点从文件中读取,放到内存,下载下来,直到完成整个下载过程。这样内存就不会担心你一下子占用它那么多空间了。
        wrapper = FileWrapper(s)
        response = HttpResponse(wrapper, content_type='application/zip')
        response['Content-Disposition'] = 'attachment; filename={}.zip'.format(datetime.datetime.now().strftime("%Y-%m-%d"))
        return response
    
    download_urls = [{"name":"pdf1","download_url": "http://xxx.pdf"}, {"name":"pdf2", "download_url": "http://xxx2.pdf"}]
    contract_download(download_urls)
    

本文链接:时光不写博客-Django下载zip文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

时光不写代码

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

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

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

打赏作者

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

抵扣说明:

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

余额充值