最近在整合Django的相关资料,讲在未来慢慢记录,今天先吧csv相关的写如。
这里我们使用的开发工具是pycharm,建立一个app后我们在views.py文件下做如下操作
from django.http import HttpResponse
import csv
def index(request):
response = HttpResponse(content_type='text/csv') #告诉浏览器这是一个 csv 格式的文件 不是html 如果不指定 就是html
response['Content-Disposition']="attechment;filename='abc.csv'"# 在 response 添加一个 'Content-Disposition'头 这样的话 是为了告诉他 该怎么样处理这个csv文件 attechment 说明这是一个附件 这样浏览器就不会显示它 而是下载 filename='abc.csv' 是指定附件的名字
writer = csv.writer(response) #writer 将 内容写进respone
writer.writerow(['username','age','height'])
writer.writerow(['qulinx', '18', '181cm']) #这两部是讲内容逐行写入
return response
这样,在访问该对于的地址后,会自自动下载一个abc.csv的文件
===============
因为csv文件的强大功能,我们有可能吧内容根据不同的样式写入csv中,所以每次排列都会很繁琐,所以Django还给我提供了一个模板功能,能以讲写入模板样式准备好,在要使用的时候调用就可以,避免的国多的无用操作。
1.需要想template文件夹下面建立模板,假设奖励的模板文件名为:python.txt (后缀没有要求,Django都可以识别)
写入如下内容:
{% for row in rows%}{{row.0}}{{row.1}}{{row.2}}{% endfor %}
关于模板语句,将会在日后更新~
#该模板的作用是讲文本逐个输出,
#注意到换行,标点等都会对结果产生影响
2.在view.py中写:
import csv #操作csv
from django.template import loader #操作模板
def template_csv_view(request):
response = HttpResponse(content_type='text/csv') #创建一个HttpResponse对象
response['Content-Disposition'] = "attechment;filename='linzhen.csv'"
context = {
'rows':[
['username','age','height'],
['康康',18,'181cm',]
]
} #context字典的key为rows,因为模板中遍历的对象也是rows,所以要一直
template= loader.get_template('python1806.txt') #导入模板
csv_template = template.render(context) #讲context根据模板渲染
response.content = csv_template #讲渲染结果赋给respones.content
return response
这样就会得到根据模板样式写入的csv文件~
===============
当遇到大文件的时候,就是很考验我们机器硬件的实力了,但是像apple这种企业,都会通过优化软件来改善
所以当我们要处理大文件的csv时,普通方法也是可以使用的,但是该方法可能由于文件过大导致相应时间超时。
def large_csv_view(request):
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = "attechment;filename='linzhen.csv'"
writer = csv.writer(response)
for row in range(0,1000000):
writer.writerow(['Row {}'.format(row),'{}'.format(row)])
return response
所以这里我们可以使用StreamingHttpResponse,这个类不继承于 ,HttpResponse 类似于在直播的时候边看边下载,不会卡顿
from django.http import StreamingHttpResponse #导入
def large_csv_view(request):
response = StreamingHttpResponse(content_type='text/csv')
response['Content-Disposition'] = "attechment;filename='kangbazi.csv'"
rows = ("第{},{}\n".format(row,row) for row in range(0,10000000))
response.streaming_content=rows
return response