问题描述
我试图找出一种从Django视图中以Zip HttpResponse(zip_file,content_type =“ application / x-zip-compressed”)返回多个数据帧的方法
我尝试过:
import zipfile
import datetime
def makeZipfiles(df_list):
i = 0
with zipfile.ZipFile('some_zip.zip','w') as csv_zip:
for dfl in df_list:
csv_zip.writestr(f"file_{str(i)}.csv",dfl.to_csv(index=False))
i = i + 1
return csv_zip
在视图中,我有以下内容:
zip_file = makeZipfiles(df_list)
response = HttpResponse(zip_file,content_type="application/x-zip-compressed")
return response
但是当我尝试查看下载文件夹中的zip文件时,出现一个错误,指出“档案是未知格式或已损坏”。导出的文件大小为1KB,当我在记事本中打开时,我只能看到此内容
“
请告知我要执行的操作是否可行,如果可行,请提供示例代码。
谢谢
解决方法
我自己还没有尝试过,但它似乎很适合您的需求。
https://georepublic.info/en/blog/2019/zip-files-in-django-admin-and-python/
作者详细描述了如何从不同的数据帧中获取.csv文件,最后压缩到一个文件供下载.
他的最终代码如下:
file_list = [
. . .,UserInfoResource()
]
def getfiles():
fileSet = {}
date_now = dt.datetime.now().strftime('%Y%m%d%H%M')
for file in file_list:
dataset = file.export()
dataset = dataset.csv
name = file._meta.model.__name__ + date_now
fileSet[name] = dataset
return fileSet
def download_zip(request):
files = getfiles()
zip_filename = 'Survey_Data' + dt.datetime.now().strftime('%Y%m%d%H%M') + '.zip'
zip_buffer = io.BytesIO()
with zipfile.ZipFile(zip_buffer,"a",zipfile.ZIP_DEFLATED,False) as zip_file:
for k,file in files.items():
zip_file.writestr(k + '.csv',file)
zip_buffer.seek(0)
resp = HttpResponse(zip_buffer,content_type='application/zip')
resp['Content-Disposition'] = 'attachment; filename = %s' % zip_filename
return resp
如果我设法在我自己的网站上应用这个答案,我会更新这个答案。 (如果您在此期间找到了更好的答案,请告诉我们,谢谢;))