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实现得到一个给定类的虚函数
Sep 28 Python
使用Python的PIL模块来进行图片对比
Feb 18 Python
Python3中类、模块、错误与异常、文件的简易教程
Nov 20 Python
python中kmeans聚类实现代码
Feb 23 Python
python DataFrame 取差集实例
Jan 30 Python
深入浅析python 协程与go协程的区别
May 09 Python
python与C、C++混编的四种方式(小结)
Jul 15 Python
详谈tensorflow gfile文件的用法
Feb 05 Python
Python对象的属性访问过程详解
Mar 05 Python
python topk()函数求最大和最小值实例
Apr 02 Python
对python中arange()和linspace()的区别说明
May 03 Python
解决python对齐错误的方法
Jul 16 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结合Ajax实现点赞功能完整实例
2015/01/30 PHP
php+html5+ajax实现上传图片的方法
2016/05/14 PHP
thinkphp下MySQL数据库读写分离代码剖析
2017/04/18 PHP
详解将数据从Laravel传送到vue的四种方式
2019/10/16 PHP
对JavaScript的eval()中使用函数的进一步讨论
2008/07/26 Javascript
商城常用滚动的焦点图效果代码简单实用
2013/03/28 Javascript
JavaScript操纵窗口的方法小结
2013/06/28 Javascript
js判断输入是否为数字的具体实例
2013/08/03 Javascript
javascript删除option选项的多种方法总结
2013/11/22 Javascript
js打开新窗口方法整理
2014/02/17 Javascript
js QQ客服悬浮效果实现代码
2014/12/12 Javascript
jQuery插件FusionCharts绘制的2D条状图效果【附demo源码】
2017/05/13 jQuery
说说如何利用 Node.js 代理解决跨域问题
2019/04/22 Javascript
JavaScript forEach中return失效问题解决方案
2020/06/01 Javascript
详解Vue2的diff算法
2021/01/06 Vue.js
[04:10]2016国际邀请赛中国区预选赛第二日TOP10精彩集锦
2016/06/28 DOTA
[52:14]VG vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
python数组复制拷贝的实现方法
2015/06/09 Python
Python cx_freeze打包工具处理问题思路及解决办法
2016/02/13 Python
Python 文件操作的详解及实例
2017/09/18 Python
python数据结构之线性表的顺序存储结构
2018/09/28 Python
python3.6数独问题的解决
2019/01/21 Python
pycharm访问mysql数据库的方法步骤
2019/06/18 Python
python下PyGame的下载与安装过程及遇到问题
2019/08/04 Python
python中count函数简单的实例讲解
2020/02/06 Python
python判断元素是否存在的实例方法
2020/09/24 Python
Boden美国官网:英伦原创时装品牌
2017/07/03 全球购物
如何转换一个字符串到enum值
2014/04/12 面试题
写给女生的道歉信
2014/01/08 职场文书
公司合作协议书范本
2014/04/18 职场文书
人力资源本科毕业生求职信
2014/06/04 职场文书
趣味运动会广播稿
2014/09/13 职场文书
2015年青年志愿者工作总结
2015/05/20 职场文书
小学英语教学经验交流材料
2015/11/02 职场文书
如何写好一份优秀的工作总结?
2019/06/21 职场文书
Python学习之os包使用教程详解
2022/03/21 Python