关于Django下scv文件的基本操作

最近在整合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
发布了14 篇原创文章 · 获赞 12 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Watson_Ashin/article/details/82950867