对在 django 中将 CSV 文件转换为 ZIP 文件感到困惑
Posted
技术标签:
【中文标题】对在 django 中将 CSV 文件转换为 ZIP 文件感到困惑【英文标题】:Confused about making a CSV file into a ZIP file in django 【发布时间】:2009-09-10 04:57:22 【问题描述】:我有一个视图,它从我的站点获取数据,然后将其制成一个 zip 压缩的 csv 文件。这是我的无 zip 工作代码:
def backup_to_csv(request):
response = HttpResponse(mimetype='text/csv')
response['Content-Disposition'] = 'attachment; filename=backup.csv'
writer = csv.writer(response, dialect='excel')
#code for writing csv file go here...
return response
而且效果很好。现在我希望该文件在发送出去之前被压缩。这就是我卡住的地方。
def backup_to_csv(request):
output = StringIO.StringIO() ## temp output file
writer = csv.writer(output, dialect='excel')
#code for writing csv file go here...
response = HttpResponse(mimetype='application/zip')
response['Content-Disposition'] = 'attachment; filename=backup.csv.zip'
z = zipfile.ZipFile(response,'w') ## write zip to response
z.writestr("filename.csv", output) ## write csv file to zip
return response
但事实并非如此,我不知道该怎么做。
【问题讨论】:
【参考方案1】:好的,我明白了。这是我的新功能:
def backup_to_csv(request):
output = StringIO.StringIO() ## temp output file
writer = csv.writer(output, dialect='excel')
#code for writing csv file go here...
response = HttpResponse(mimetype='application/zip')
response['Content-Disposition'] = 'attachment; filename=backup.csv.zip'
z = zipfile.ZipFile(response,'w') ## write zip to response
z.writestr("filename.csv", output.getvalue()) ## write csv file to zip
return response
【讨论】:
是的,这会起作用(如果未压缩的输出很好地适合内存,否则考虑磁盘上的临时文件)。【参考方案2】:请注意,在工作情况下,您如何 return response
... 而在非工作情况下,您如何返回 z
,这当然是不是HttpResponse
(虽然它应该是!)。
所以:不要在response
上使用您的csv_writer
,而是在临时文件上使用;压缩临时文件;并将 THAT 压缩字节流写入 response
!
【讨论】:
好的,我更新了我的 OP 以反映我认为你在这里所说的内容。但我仍然缺少一些东西。我收到一个 AttributeError 说“StringIO 没有 len 方法”。我应该使用 StringIO 以外的其他东西将 csv 写入吗? 要提取 StringIO 实例的字符串值(这样你就可以得到它的len
等),一旦你写完它就使用thestringioinstance.getvalue()
(在你关闭它之前!- )。【参考方案3】:
zipfile.ZipFile(response,'w')
似乎在 python 2.7.9 中不起作用。 response 是一个 django.HttpResponse 对象(据说是类似文件的)但它给出了一个错误 "HttpResponse object没有属性'seek'。在python 2.7.0或2.7.6中运行相同的代码(我没有在其他版本中测试过)就可以了......所以你最好用 python 2.7.9 测试它,看看你是否得到相同的行为。
【讨论】:
以上是关于对在 django 中将 CSV 文件转换为 ZIP 文件感到困惑的主要内容,如果未能解决你的问题,请参考以下文章