python django下载大的csv文件实现方法分析


Posted in Python onJuly 19, 2019

本文实例讲述了python django下载大的csv文件实现方法。分享给大家供大家参考,具体如下:

接手他人项目,第一个要优化的点是导出csv的功能,而且要支持比较多的数据导出,以前用php实现过,直接写入php://output就行了,django怎么做呢?如下:

借助django的StreamingHttpResponse和python的generator

def outputCSV(rows, fname="output.csv", headers=None):
  def getContent(fileObj):
    fileObj.seek(0)
    data = fileObj.read()
    fileObj.seek(0)
    fileObj.truncate()
    return data
  def genCSV(rows, headers):
    # 准备输出
    output = cStringIO.StringIO()
    # 写BOM
    output.write(bytearray([0xFF, 0xFE]))
    if headers != None and isinstance(headers, list):
      headers = codecs.encode("\t".join(headers) + "\n", "utf-16le")
      output.write(headers)
      yield getContent(output)
    for row in rows:
      rowData = codecs.encode("\t".join(row) + "\n", "utf-16le")
      output.write(rowData)
      yield getContent(output) #因为StreamingHttpResponse需要一个Iterator
    output.close()
  resp = StreamingHttpResponse(genCSV(rows, headers))
  resp["Content-Type"] = "application/vnd.ms-excel; charset=utf-16le"
  resp["Content-Type"] = "application/octet-stream"
  resp["Content-Disposition"] = "attachment;filename=" + fname
  resp["Content-Transfer-Encoding"] = "binary"
  return resp

假设遍历结果集的代码如下:

headers = ["col1", "col2", ..., "coln"]
def genRows():
      for obj in objList:
        yield [obj.col1, obj.col2, ...obj.coln]   
#这样调用,返回response
return outputCSV(genRows(), "file.csv", headers)

有人可能会问,为什么不用python自带的csv.writer?因为生成的csv兼容不太好啊,关于csv的兼容性,可以看前面这篇避免UTF-8的csv文件打开中文出现乱码的方法。

参考:http://stackoverflow.com/questions/5146539/streaming-a-csv-file-in-django

希望本文所述对大家基于Django框架的Python程序设计有所帮助。

Python 相关文章推荐
python BeautifulSoup设置页面编码的方法
Apr 03 Python
Python对数据库操作
Mar 28 Python
Numpy array数据的增、删、改、查实例
Jun 04 Python
pandas带有重复索引操作方法
Jun 08 Python
Python实现自定义函数的5种常见形式分析
Jun 16 Python
tensorflow学习教程之文本分类详析
Aug 07 Python
对python中GUI,Label和Button的实例详解
Jun 27 Python
33个Python爬虫项目实战(推荐)
Jul 08 Python
python同步windows和linux文件
Aug 29 Python
Python统计时间内的并发数代码实例
Dec 28 Python
python使用Thread的setDaemon启动后台线程教程
Apr 25 Python
python开发入门——列表生成式
Sep 03 Python
python使用flask与js进行前后台交互的例子
Jul 19 #Python
Django 模型类(models.py)的定义详解
Jul 19 #Python
Tensorflow实现神经网络拟合线性回归
Jul 19 #Python
使用TensorFlow实现简单线性回归模型
Jul 19 #Python
详解将Python程序(.py)转换为Windows可执行文件(.exe)
Jul 19 #Python
简单了解django缓存方式及配置
Jul 19 #Python
python实现最小二乘法线性拟合
Jul 19 #Python
You might like
php下mysql数据库操作类(改自discuz)
2010/07/03 PHP
mac下使用brew配置环境的步骤分享
2011/05/23 PHP
php与Mysql的一些简单的操作
2015/02/26 PHP
PHP常用的排序和查找算法
2015/08/06 PHP
表单元素事件 (Form Element Events)
2009/07/17 Javascript
基于JavaScript实现继承机制之调用call()与apply()的方法详解
2013/05/07 Javascript
jquery 为a标签绑定click事件示例代码
2014/06/23 Javascript
js中string转int把String类型转化成int类型
2014/08/13 Javascript
js控制鼠标事件移动及移出效果显示
2014/10/19 Javascript
Javascript 中创建自定义对象的方法汇总
2014/12/04 Javascript
浅谈javascript面向对象程序设计
2015/01/21 Javascript
阿里巴巴技术文章分享 Javascript继承机制的实现
2016/01/14 Javascript
JavaScript中通过提示框跳转页面的方法
2016/02/14 Javascript
javascript中的深复制详解及实例分析
2016/12/29 Javascript
jQuery插件jqGrid动态获取列和列字段的方法
2017/03/03 Javascript
Bootstrap里的文件分别代表什么意思及其引用方法
2017/05/01 Javascript
慕课网题目之js实现抽奖系统功能
2017/09/19 Javascript
Angular简单验证功能示例
2017/12/22 Javascript
vue项目常用组件和框架结构介绍
2017/12/24 Javascript
Ionic学习日记实现验证码倒计时
2018/02/08 Javascript
微信小程序控制台提示warning:Now you can provide attr "wx:key" for a "wx:for" to improve performance解决方法
2019/02/21 Javascript
js实现for循环跳过undefined值示例
2019/07/02 Javascript
详解Python如何获取列表(List)的中位数
2016/08/12 Python
python利用正则表达式搜索单词示例代码
2017/09/24 Python
python学习--使用QQ邮箱发送邮件代码实例
2019/04/16 Python
python基于itchat模块实现微信防撤回
2019/04/29 Python
Python基于pygame实现单机版五子棋对战
2019/12/26 Python
Anaconda和ipython环境适配的实现
2020/04/22 Python
意大利火车票和铁路通行证专家:ItaliaRail
2019/01/22 全球购物
如何将整数int转换成字串String
2014/03/21 面试题
班组长工作职责
2013/12/25 职场文书
蓝颜请假条
2014/04/11 职场文书
2016年安全月活动总结
2016/04/06 职场文书
《敬重卑微》读后感3篇
2019/11/26 职场文书
Prometheus 监控MySQL使用grafana展示
2021/08/30 MySQL
postgreSQL数据库基础知识介绍
2022/04/12 PostgreSQL