django框架学习:三十四.动态生成CSV文件

前言

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
posted @ 2020-05-13 16:52  流水小哥  阅读(269)  评论(0编辑  收藏  举报