python压缩文件

  • 使用zipfile
1
2
3
4
5
6
7
8
9
10
11
12
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下载
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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)