前言
CSV以纯文本形式存储数字和文本数据的存储方式,纯文本意味着改文件是一个字符序列,不含必须像二进制数字那样的数据。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其他字符或者字符串,最常见的是逗号或制表符,通常,所有记录都有完全相同的字段序列。
要在django视图中生成CSV文件,可以使用Python的CSV库或者django的模版系统来实现。
一.使用python的CSV库
python自带处理CSV文件的标准库csv。csv模块的csv文件创建功能类似于文件对象创建,并且django的HttpResponse对象也是类似于文件的对象。
实例:
from django.http import HttpResponseRedirect,HttpResponse
import csv
def some_view(request):
response=HttpResponse(content_type="text/csv")
response["Content-Disposition"]="attachment; filename='somefilename.csv'"
writer = csv.writer(response)
writer.writerow(['Frist row','Foo','Bar','Baz'])
writer.writerow(['second row','A','B','C','Testing'])
return response
相关说明:
相应对象的MIME类型设置为text/csv,告诉浏览器返回的是一个CSV文件。
相应对象设置里附加的Content-Disposition协议头,含有CSV文件文件的名称,文件名随便取,浏览器会在“另存为...”对话框等环境中使用它。
要在生成CSV的API中使用钩子非常简单:只需要把response作为第一个参数传递给csv.writer。csv.writer方法接收一个类似于文件的对象,而HttpResponse对象正好就是这么个东西。
对于csv的每一行,调用writer.writerrow,向他传递一个可迭代的对象比如列表或者元祖。
csv模板会为你处理各种引用,不用担心没有转义字符串中的引号或者逗号。只需要向writerow()传递你的原始字符串,它就会执行正确的操作。
当处理大尺寸文件时,可以使用django的StreamHttpResponse类,通过流式传输,避免负载均衡器在服务器生成响应的时候断掉连接,提高传输可靠性。
在下面的例子中,利用python的生成器来有效处理发尺寸CSV文件的拼接和传输:
import csv
from django.http import StreamingHttpResponse
class Echo(object):
def write(selfself,value):
return value
def some_streaming_csv_view(request):
rows = (["Row {}".format(idx),str(idx)] for idx in range(65536))
'''伪缓存'''
pseudo_buffer = Echo()
writer = csv.writer(pseudo_buffer)
response = StreamingHttpResponse((writer.writerow(row)for row in rows),content_type="text/csv")
response["Content-Disposition"]="attachment; filename='somefilename.csv'"
return response