image

在上一篇文章,我介绍了CSV是什么?CSV有哪些优点?如何使用等等?并且最后我们用一个例子简单讲解了如何使用Python模块CSV进行导出后缀为.csv的文本文件。

其实例子用于异步导出数据文件是够了,但工作中我们可能还需要结合我们Web框架进行更复杂的CSV导出。

所以今天我们的目的就是结合Python Django框架进行分享CSV导出的另外一种方式。

安装依赖

这里面我们需要安装一个第三方包djangorestframework-csv:

方法如下,使用pip安装到你virtualenv构建的虚拟环境中,当然你如果使用了docker进行环境隔离这儿也可以直接安装你docker容器中。

$ pip install djangorestframework-csv

有些同学可能不太明白,明明是Django框架怎么和Django REST Framework(简称DRF)扯上关系了,简单解释一下,由于我们Django API开发常常配合DRF进行,所以一般都是一起安装使用了的,把Django和DRF结合起来整个RESTFul API开发效率能大大提高,建议稍微大一点工程化项目都去使用DRF。

使用

使用方式如下:

继承CSVRenderer 定义一个自己的Render类

将要生成CSV的字典数据传入该类的方法render方法

使用HttpResponse或者StreamingHttpResponse进行返回

看起来是不是简单方便,确实就是这么简单,下面我们看一个例子。

例子

废话不多说,直接上代码,先定义一个自己的CSV Render

# 定义CSV Render

from rest_framework_csv import renderers

class YourModelRender(renderers.CSVStreamingRenderer):

header = [

'phone',

'remark',

'create_time',

]

labels = dict([

('phone', u'联系电话'),

('remark', u'备注'),

('create_time', u'时间'),

])

这里使用label dict属性将自定义标签应用于CSVRenderer,其中每个键对应于表头header,值对应于该表头header的自定义标签,这样我们各个值就能和header对应起来。

Django导出的view方法,源码如下。

@list_route(methods=['get']) # 这是DRF生成URL的方式,没用过的可以忽略。

def example_export_csv(self):

'''

CSV 案例

'''

queryset = YourModel.objects.all()

renderer = YourModelRender()

data = (

YourModelListSerializer(instance).data ## 得到字典数据

for instance in queryset

)

response = StreamingHttpResponse(

renderer.render(data),

content_type='text/csv'

)

response['Content-Disposition'] = 'attachment; filename="somefilename.csv"'

return response

上面几行代码是不是看起来很简单,确实就是这么简单,简单的背后是rest_framework_csv帮我们做了导出功能,底层实现还是昨天我说的那种方式write,writerow的方式。

这里面简单解释一下:

YourModelListSerializer写过DRF的同学知道这个就是定义数据处理逻辑校验,格式化什么等操作。这里面我们通过YourModelListSerializer复用了其他模块处理逻辑,如RRESTFul的列表数据展示。

这样大大减少了我们导出CSV还需要去重新处理多个字段组装,过滤,变换等逻辑。因为往往我们列表需要展示数据就是我们CSV要导出的数据。记得几年前那会儿导出数据还要自己重新组装数据,真是酸爽。

我们这儿用了StreamingHttpResponse,将文件内容进行流式传输,对于实时导出大文件,可以避免服务器断开连接。比起HttpResponse更节约内存。

其他

上面我们使用DRF,并且也用了看起来复杂的YourModelListSerializer这种复杂的概念,主要目的是让大家知道DRF的方式,至于普通使用Django其实我们完全可以把renderer.render(data)换为上一篇文章

(writer.writerow(row) for row in rows) 这种形势。

关于CSV我们还可以用Django模板形式进行,和我们用rest_framework_csv模块思路差不多

简单给一个官方案例:

csv_data = (

('First row', 'Foo', 'Bar', 'Baz'),

('Second row', 'A', 'B', 'C', '"Testing"', "Here's a quote"),

)

t = loader.get_template('my_template_name.txt') # 定义模板代码

c = Context({

'data': csv_data,

})

response.write(t.render(c))

return response

虽然思路相似,但过程实现会麻烦较多,你要去切换模板代码书写,渲染,不推荐这种方式。

最后关于CSV我们就介绍到这里,结合上一篇主要两种方式:

普通CSV导出+Celery Beat定时导出

Django + DRF + 实时导出

原理都是Python内置模块CSV的一些变换,只是结合第三库,让我们操作更快更方便起来。

image

扫码免费加入我们

更多阅读:

image

python输出csv文件-更高效的Python CSV文件导出相关推荐

  1. python输出excel能够识别的utf-8格式csv文件

    http://blog.csdn.net/azhao_dn/article/details/16989777 可能大家都遇到过,python在输出的csv文件中如果有utf-8格式的中文,那么在使用e ...

  2. python输出字体的大小_Python密码学编程:文件的加密与解密

    在之前的章节中,编写的程序只能操作较少的信息,这些信息往往是以字符串的形式直接写在代码中的.但本章中的程序可以对整个文件进行加密和解密,文件的大小可以包括成千上万个字符. 本章要点 open()方法. ...

  3. python输出数据到excel-如何使用python将大量数据导出到Excel中的小技巧之一

    如何使用python将大量数据导出到Excel中的小技巧 (1) 问题描述:为了更好地展示数据,Excel格式的数据文件往往比文本文件更具有优势,但是具体到python中,该如何导出数据到Excel呢 ...

  4. python输出一个月日历表_关于python一个月总结

    今天是6月16了,我在上个月19号的时候敲下了人生中的第一行python的hello world代码.碰巧今天周末,明天又开始忙碌的上(mo)班(yu).趁着现在对这个月的学习做一个总结,也是理清思路 ...

  5. python输出可执行文件_重定向-禁止在Python调用中输出可执行文件

    重定向-禁止在Python调用中输出可执行文件 我有一个名为B的二进制文件,该文件在调用时会生成输出. 如果从Bash shell调用它,则大多数输出将受到A > /dev/null的抑制.所有 ...

  6. python 字典 列表 速度_高效使用Python字典的清单

    字典(dict)对象是 Python 最常用的数据结构,社区曾有人开玩笑地说:"Python企图用字典装载整个世界",字典在Python中的重要性不言而喻,这里整理了几个关于高效使 ...

  7. python爬虫-8个最高效的Python爬虫框架,你用过几个?

    小编收集了一些较为高效的Python爬虫框架.分享给大家. 1.Scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系 ...

  8. python输出表格到word_如何将python输出的内容输入到表格Excel中_excel表格导入word太大...

    想问下python3怎么将列表数据逐行写入excel表格呢? import xlwtf = xlwt.Workbook() #创建工作薄sheet1 = f.add_sheet(u'sheet1',c ...

  9. 【蓝桥杯选拔赛真题07】python输出乘积 青少年组蓝桥杯python 选拔赛STEMA比赛真题解析

    目录 python输出乘积 一.题目要求 1.编程实现 2.输入输出 二.解题思路

最新文章

  1. AD7606数据采集板使用ASCII码传递BINARY数据
  2. c++ 遍历多级目录
  3. swift中使用core data
  4. pmp思维导图 第六版_《每天一小时,两月过PMP》备考指南(附计划表)
  5. 26个LinkedList用法示例大全以及与ArrayList/数组的相互转换
  6. 面向对象设计模式之策略模式
  7. GitHub 年度报告正式发布,JavaScript 霸榜、TypeScript 爆发!
  8. css:transform,transition,animation总结
  9. 高性能的分布式内存对象缓存系统Memcached
  10. 2009年11月14日上海讲座-Linux触摸屏驱动PPT
  11. Ae 效果快速参考:3D 通道
  12. 计算机创业计划书800字大全,创业计划书范文800字
  13. 前端验证手机号和座机号号码
  14. (20200226已解决)PyCharm里的黄色波浪线
  15. 1234的平方根用计算机怎么算,平方根计算
  16. 上传文件到OOS服务器
  17. Linux进程间关系之终端与终端登录
  18. 专业范儿的图表,打造专业范儿的技术人PPT
  19. 应该来说没有什么太大的关系。因为计算精度既取决于你的级数的项
  20. HTML5常用标签【知识点整理】

热门文章

  1. 最新的ES 5.0路由算法底层实现
  2. 基于windows平台搭建elasticsearch 补充
  3. OpenStack创建网络和虚拟机、dhcp设备、虚拟路由器、虚拟机访问外网原理分析
  4. CF396C On Changing Tree
  5. I/O模型之一:Unix的五种I/O模型
  6. JavaScript高级程序设计学习笔记--引用类型
  7. 如何定义一个自己的可复用的JS文件
  8. Celery - 一个懂得 异步任务 , 定时任务 , 周期任务 的芹菜
  9. Nginx.代理MySQL
  10. ZBrush中如何做不同图案的遮罩