python压缩文件
-
使用
zipfile
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)
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文件