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

问题描述

我试图找出一种从Django视图中以Zip HttpResponse(zip_file,content_type =“ application / x-zip-compressed”)返回多个数据帧的方法

我尝试过:

@H_502_4@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

在视图中,我有以下内容

@H_502_4@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

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