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语言的优雅之处
Jul 04 Python
Python与Redis的连接教程
Apr 22 Python
Python中用于检查英文字母大写的isupper()方法
May 19 Python
Python实现微信自动好友验证,自动回复,发送群聊链接方法
Feb 21 Python
python找出一个列表中相同元素的多个索引实例
Jun 11 Python
PyTorch的Optimizer训练工具的实现
Aug 18 Python
python安装本地whl的实例步骤
Oct 12 Python
Python操作多维数组输出和矩阵运算示例
Nov 28 Python
TensorFlow获取加载模型中的全部张量名称代码
Feb 11 Python
Python调用C语言程序方法解析
Jul 07 Python
Python中的min及返回最小值索引的操作
May 10 Python
python关于集合的知识案例详解
May 30 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中include与require使用方法区别详解
2013/10/19 PHP
PHP遍历目录并返回统计目录大小
2014/06/09 PHP
PHP实现删除多重数组对象属性并重新赋值的方法
2017/06/07 PHP
YII2框架中添加自定义模块的方法实例分析
2020/03/18 PHP
云网广告中的代码,提示出错,大家找找
2006/11/21 Javascript
异步加载script的代码
2011/01/12 Javascript
jquery对dom的操作常用方法整理
2013/06/25 Javascript
jquery图形密码实现方法
2015/03/11 Javascript
使用javaScript动态加载Js文件和Css文件
2015/10/24 Javascript
angularjs封装bootstrap时间插件datetimepicker
2016/06/20 Javascript
基于NodeJS+MongoDB+AngularJS+Bootstrap开发书店案例分析
2017/01/12 NodeJs
win系统下nodejs环境安装配置
2017/05/04 NodeJs
jQuery Easyui Treegrid实现显示checkbox功能
2017/08/08 jQuery
Three.js如何用轨迹球插件(trackball)增加对模型的交互功能详解
2017/09/25 Javascript
详解基于Node.js的HTTP/2 Server实践
2018/05/31 Javascript
详解vue-router 命名路由和命名视图
2018/06/01 Javascript
JavaScript链式调用实例浅析
2018/12/19 Javascript
jquery validate 实现动态增加/删除验证规则操作示例
2019/10/28 jQuery
python实现输入数字的连续加减方法
2018/06/22 Python
对python列表里的字典元素去重方法详解
2019/01/21 Python
对python生成业务报表的实例详解
2019/02/03 Python
Python Threading 线程/互斥锁/死锁/GIL锁
2019/07/21 Python
Python无头爬虫下载文件的实现
2020/04/02 Python
python中spy++的使用超详细教程
2021/01/29 Python
Canvas实现贝赛尔曲线轨迹动画的示例代码
2019/04/25 HTML / CSS
蛋白质世界:Protein World
2017/11/23 全球购物
澳大利亚在线性感内衣商店:Fantasy Lingerie
2021/02/07 全球购物
新锐科技Java程序员面试题
2016/07/25 面试题
三八妇女节演讲稿
2014/05/27 职场文书
政治学求职信
2014/06/03 职场文书
有限责任公司股东合作协议书
2014/12/02 职场文书
2014年网管工作总结
2014/12/11 职场文书
庆祝教师节主题班会
2015/08/17 职场文书
2019年工作总结范文
2019/05/21 职场文书
经典哲理警句:志不真则心不热,心不热则功不贤
2019/11/14 职场文书
Python图片验证码降噪和8邻域降噪
2021/08/30 Python