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 Matplot中文显示完美解决方案
Mar 07 Python
python Django 创建应用过程图示详解
Jul 29 Python
python opencv鼠标事件实现画框圈定目标获取坐标信息
Apr 18 Python
修改 CentOS 6.x 上默认Python的方法
Sep 06 Python
pygame实现贪吃蛇游戏(下)
Oct 29 Python
Python3常用内置方法代码实例
Nov 18 Python
python实现二分类的卡方分箱示例
Nov 22 Python
python plotly画柱状图代码实例
Dec 13 Python
关于初始种子自动选取的区域生长实例(python+opencv)
Jan 16 Python
浅析Python requests 模块
Oct 09 Python
Python classmethod装饰器原理及用法解析
Oct 17 Python
Django celery异步任务实现代码示例
Nov 26 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
如何修改和添加Apache的默认站点目录
2013/07/05 PHP
解决PHP程序运行时:Fatal error: Maximum execution time of 30 seconds exceeded in的错误提示
2016/11/25 PHP
PHP使用递归算法无限遍历数组示例
2017/01/13 PHP
Python中使用django form表单验证的方法
2017/01/16 PHP
一个判断email合法性的函数[非正则]
2008/12/09 Javascript
js+html5操作sqlite数据库的方法
2016/02/02 Javascript
JavaScript编程中实现对象封装特性的实例讲解
2016/06/24 Javascript
JS实现的点击表头排序功能示例
2017/03/27 Javascript
React Native中导航组件react-navigation跨tab路由处理详解
2017/10/31 Javascript
vue+iview写个弹框的示例代码
2017/12/05 Javascript
微信小程序如何调用图片接口API并居中显示
2019/06/29 Javascript
vue.js基于v-for实现批量渲染 Json数组对象列表数据示例
2019/08/03 Javascript
[35:29]Secret vs VG 2018国际邀请赛淘汰赛BO3 第三场 8.23
2018/08/24 DOTA
[03:11]TI9战队档案 - Alliance
2019/08/20 DOTA
python uuid模块使用实例
2015/04/08 Python
Python编写登陆接口的方法
2017/07/10 Python
Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例
2017/12/12 Python
Django获取该数据的上一条和下一条方法
2019/08/12 Python
python__name__原理及用法详解
2019/11/02 Python
pytorch 实现将自己的图片数据处理成可以训练的图片类型
2020/01/08 Python
python GUI库图形界面开发之PyQt5访问系统剪切板QClipboard类详细使用方法与实例
2020/02/27 Python
Python自动化测试笔试面试题精选
2020/03/12 Python
Win10下配置tensorflow-gpu的详细教程(无VS2015/2017)
2020/07/14 Python
澳大利亚领先的女性运动服品牌:Lorna Jane
2020/06/19 全球购物
枚举和一组预处理的#define有什么不同
2016/09/21 面试题
存储过程的优点有哪些
2012/09/27 面试题
函授本科毕业生自我鉴定
2013/10/16 职场文书
《猴子种树》教学反思
2014/02/14 职场文书
2014房屋登记授权委托书
2014/10/13 职场文书
2014幼儿园大班工作总结
2014/11/10 职场文书
项目建议书
2015/02/04 职场文书
热血教师观后感
2015/06/10 职场文书
婚宴新郎致辞
2015/07/28 职场文书
全家福照片寄语怎么写?
2019/04/02 职场文书
HTML+CSS+JS实现图片的瀑布流布局的示例代码
2021/04/22 HTML / CSS
Python 装饰器(decorator)常用的创建方式及解析
2022/04/24 Python