将多个熊猫数据帧作为单个 Django zip 文件返回(每个 DF 一个文件)HttpResponse
Posted
技术标签:
【中文标题】将多个熊猫数据帧作为单个 Django zip 文件返回(每个 DF 一个文件)HttpResponse【英文标题】:return multiple pandas Dataframes as single Django zip files (one file per DF) HttpResponse 【发布时间】:2020-08-13 13:37:00 【问题描述】:我试图想办法从 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,当我在记事本中打开时,我只看到此内容
"
请告知我正在尝试做的事情是否可行,如果可行,请提供示例代码。
谢谢
【问题讨论】:
【参考方案1】:我自己还没有尝试过,但它似乎非常适合您的需求。
https://georepublic.info/en/blog/2019/zip-files-in-django-admin-and-python/
作者详细介绍了如何从不同的dataframe中获取.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
如果我设法在自己的网站上应用此答案,我将更新此答案。 (如果您在此期间找到了更好的答案,请告诉我们,谢谢;))
【讨论】:
以上是关于将多个熊猫数据帧作为单个 Django zip 文件返回(每个 DF 一个文件)HttpResponse的主要内容,如果未能解决你的问题,请参考以下文章