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实现baidu hi自动登录的代码
Feb 10 Python
Python加pyGame实现的简单拼图游戏实例
May 15 Python
Python实现简单的代理服务器
Jul 25 Python
Python聚类算法之基本K均值实例详解
Nov 20 Python
Windows下python3.7安装教程
Jul 31 Python
python 自动重连wifi windows的方法
Dec 18 Python
利用python提取wav文件的mfcc方法
Jan 09 Python
python获取微信企业号打卡数据并生成windows计划任务
Apr 30 Python
python中的&&及||的实现示例
Aug 07 Python
详解Python可视化神器Yellowbrick使用
Nov 11 Python
python获取系统内存占用信息的实例方法
Jul 17 Python
python 下载文件的几种方式分享
Apr 07 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
历史证明,懒惰才是推动科学发展技术进步的动力
2021/03/02 无线电
法压式咖啡之制作法
2021/03/03 冲泡冲煮
关于Intype一些小问题的解决办法
2008/03/28 PHP
jQuery EasyUI API 中文文档 - DateBox日期框
2011/10/15 PHP
基于PHP读取TXT文件向数据库导入海量数据的方法
2013/04/23 PHP
探讨捕获php错误信息方法的详解
2013/06/09 PHP
php5.4以上版本GBK编码下htmlspecialchars输出为空问题解决方法汇总
2015/04/03 PHP
[原创]后缀就扩展名为js的文件是什么文件
2007/12/06 Javascript
javaScript 简单验证代码(用户名,密码,邮箱)
2009/09/28 Javascript
基于jQuery的前端数据通用验证库
2011/08/08 Javascript
Javascript数组的排序 sort()方法和reverse()方法
2012/06/04 Javascript
如何阻止复制剪切和粘贴事件为了表单内容的安全
2013/05/23 Javascript
js下拉菜单语言选项简单实现
2013/09/23 Javascript
nodejs中使用monk访问mongodb
2014/07/06 NodeJs
js文件包含的几种方式介绍
2014/09/28 Javascript
Windows系统下Node.js的简单入门教程
2015/06/23 Javascript
IE6兼容透明背景图片及解决方案
2015/08/19 Javascript
jQuery+CSS3实现3D立方体旋转效果
2015/11/10 Javascript
JavaScript的Number对象的toString()方法
2015/12/18 Javascript
jQuery判断元素是否显示 是否隐藏的简单实现代码
2016/05/19 Javascript
浅析Bootstrap表格的使用
2016/06/23 Javascript
简单实现js无缝滚动效果
2017/02/05 Javascript
angularjs实现上拉加载和下拉刷新数据功能
2017/06/12 Javascript
js+canvas实现两张图片合并成一张图片的方法
2019/11/01 Javascript
JavaScript判断浏览器版本的方法
2019/11/03 Javascript
详解Vue Cli浏览器兼容性实践
2020/06/08 Javascript
解决Vue大括号字符换行踩的坑
2020/11/09 Javascript
小程序实现tab标签页
2020/11/16 Javascript
[02:48]DOTA2超级联赛专访海涛:你们的选择没有错
2013/06/07 DOTA
[09:22]2014DOTA2西雅图国际邀请赛 主赛事第二日TOPPLAY
2014/07/21 DOTA
python3 requests库文件上传与下载实现详解
2019/08/22 Python
python相对企业语言优势在哪
2020/06/12 Python
应届毕业生的自我鉴定
2013/11/13 职场文书
先进事迹报告会感言
2014/01/24 职场文书
2015年学校体育工作总结
2015/04/22 职场文书
一篇文章了解正则表达式的替换技巧
2022/02/24 Javascript