将多个熊猫数据帧作为单个 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的主要内容,如果未能解决你的问题,请参考以下文章

在多个熊猫数据帧上执行相同操作的正确方法是什么?

解压熊猫数据框字典 (1,1)

如何从内存中删除多个熊猫(python)数据帧以节省 RAM?

从多个熊猫数据帧创建 HDF5

Python,熊猫连接多个数据帧

将列表列表合并到数据框熊猫中