包含带有多个 csv 文件的 zip 文件的 Django 响应
Django response that contains a zip file with multiple csv files
我有一个算法可以输出一个元组列表,可以将其写入 csv 文件。
我正在尝试写入 3 个 csv 文件(通过 StringIO,因此不写入磁盘),然后将它们一起压缩。之后我想将其附加到 django 请求的响应中。
我不确定最有效的方法是什么。我应该使用 StringIO
通过我的算法存储 3 个调用吗?我应该在压缩之前先创建 csv 文件吗?我可以直接使用 1 zipfile
调用而无需调用 3 StringIO
的中间步骤吗?
谢谢
你可以这样做:
# 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
您可能想要使用 StreamingHttpResponse
(或 FileResponse ) if the file is big
除了别人发布的答案外,我还可以通过
解决我的问题
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
的想法
我有一个算法可以输出一个元组列表,可以将其写入 csv 文件。
我正在尝试写入 3 个 csv 文件(通过 StringIO,因此不写入磁盘),然后将它们一起压缩。之后我想将其附加到 django 请求的响应中。
我不确定最有效的方法是什么。我应该使用 StringIO
通过我的算法存储 3 个调用吗?我应该在压缩之前先创建 csv 文件吗?我可以直接使用 1 zipfile
调用而无需调用 3 StringIO
的中间步骤吗?
谢谢
你可以这样做:
# 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
您可能想要使用 StreamingHttpResponse
(或 FileResponse ) if the file is big
除了别人发布的答案外,我还可以通过
解决我的问题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
的想法