返回多个熊猫数据帧作为单个Django zip文件每个DF一个文件HttpResponse

问题描述

我试图找出一种从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

如果我设法在我自己的网站上应用这个答案,我会更新这个答案。 (如果您在此期间找到了更好的答案,请告诉我们,谢谢;))

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...