Django响应包含一个包含多个csv文件的zip文件

时间:2018-06-20 16:16:52

标签: python django zipfile stringio

我有一种算法,可以输出一个元组列表,准备将其写入csv文件中。

我试图写3个csv文件(通过StringIO,所以不写磁盘),然后将它们全部压缩。之后,我要将其附加到Django请求的响应中。

我不确定执行此操作最有效的方法是什么。我是否应该使用StringIO通过我的算法存储3个电话?我应该在压缩文件之前先实际创建csv文件吗?我可以直接使用1个zipfile通话,而无需调用3个StringIO的中间步骤吗?

谢谢

2 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

# Create the zip file
output = StringIO.StringIO()
f = zipfile.ZipFile(output, 'w', zipfile.ZIP_DEFLATED)
f.writestr('first.csv', '<the content of first.csv>')
f.writestr('second.csv', '<the content of second.csv>')
f.writestr('third.csv', '<the content of third.csv>')
f.close()
# Build your response
response = HttpResponse(output.getvalue(), mimetype='application/zip')
response['Content-Disposition'] = 'attachment; filename="yourzipfilename.zip"'
return response

如果文件很大FileResponse ,则可能要使用StreamingHttpResponse(或https://stackoverflow.com/a/48949959/1904584

答案 1 :(得分:0)

除了别人发布的答案外,我还可以通过以下方式解决我的问题

zipped_file = BytesIO()
with zipfile.ZipFile(zipped_file, 'a', zipfile.ZIP_DEFLATED) as zipped:
    for h in HEADER:  # determines which csv file to write
        rs = build_my_csv(h)
        csv_data = StringIO()
        writer = csv.writer(csv_data, delimiter=',')
        writer.writerow(HEADER[h])
        for r in rs:
            writer.writerow(r)
        csv_data.seek(0)
        zipped.writestr("{}.csv".format(h), csv_data.read())
zipped_file.seek(0)
response = HttpResponse(zipped_file, content_type='application/octet-stream')
response['Content-Disposition'] = 'attachment; filename=some_name.zip'

这是使用Sending multiple .CSV files to .ZIP without storing to disk in Python

中的想法