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中使用正则表达式的连接符示例代码
Oct 10 Python
Python使用cx_Oracle模块操作Oracle数据库详解
May 07 Python
pytorch + visdom CNN处理自建图片数据集的方法
Jun 04 Python
python3+selenium实现126邮箱登陆并发送邮件功能
Jan 23 Python
python 通过可变参数计算n个数的乘积方法
Jun 13 Python
解决django服务器重启端口被占用的问题
Jul 26 Python
Django中reverse反转并且传递参数的方法
Aug 06 Python
python3的数据类型及数据类型转换实例详解
Aug 20 Python
Python实现投影法分割图像示例(一)
Jan 17 Python
Python如何实现FTP功能
May 28 Python
python实现图像外边界跟踪操作
Jul 13 Python
OpenCV项目实践之停车场车位实时检测
Apr 11 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 str_replace的替换漏洞
2008/03/15 PHP
php学习笔记 [预定义数组(超全局数组)]
2011/06/09 PHP
PHP分页详细讲解(有实例)
2013/10/30 PHP
php处理restful请求的路由类分享
2014/02/27 PHP
10个超级有用的PHP代码片段果断收藏
2015/09/23 PHP
在PHP 7下安装Swoole与Yar,Yaf的方法教程
2017/06/02 PHP
thinkPHP5实现数据库添加内容的方法
2017/10/25 PHP
php中yar框架实例用法讲解
2020/12/27 PHP
js中访问html中iframe的文档对象的代码[IE6,IE7,IE8,FF]
2011/01/08 Javascript
jQuery 操作option的实现代码
2011/03/03 Javascript
node.js中的buffer.Buffer.byteLength方法使用说明
2014/12/10 Javascript
js小数运算出现多位小数如何解决
2015/10/08 Javascript
js仿淘宝和百度文库的评分功能
2016/05/15 Javascript
老生常谈javascript变量的命名规范和注释
2016/09/29 Javascript
JavaScript模仿Pinterest实现图片预加载功能
2016/10/25 Javascript
Angularjs 实现动态添加控件功能
2017/05/25 Javascript
vue中各组件之间传递数据的方法示例
2017/07/27 Javascript
vuex存值与取值的实例
2019/11/06 Javascript
[03:39]2015国际邀请赛主赛事首日精彩回顾
2015/08/05 DOTA
Django视图和URL配置详解
2018/01/31 Python
Python判断两个list是否是父子集关系的实例
2018/05/04 Python
python 遍历列表提取下标和值的实例
2018/12/25 Python
django 模版关闭转义方式
2020/05/14 Python
丹尼尔惠灵顿手表天猫官方旗舰店:Daniel Wellington
2017/08/25 全球购物
沙特阿拉伯网上购物:Sayidaty Mall
2018/05/06 全球购物
十八大闭幕感言
2014/01/22 职场文书
《燕子专列》教学反思
2014/02/21 职场文书
阅兵口号
2014/06/19 职场文书
宾馆仓管员岗位职责
2014/07/27 职场文书
2014大学校园光棍节活动策划书
2014/09/29 职场文书
检讨书范文1000字
2015/01/28 职场文书
2015年公务员工作总结
2015/04/24 职场文书
《1942》观后感
2015/06/08 职场文书
Python使用random模块实现掷骰子游戏的示例代码
2021/04/29 Python
Python 类,对象,数据分类,函数参数传递详解
2021/09/25 Python
Java实现房屋出租系统详解
2021/10/05 Java/Android