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 (1)
Oct 31 Python
Python中join函数简单代码示例
Jan 09 Python
浅谈Python中的bs4基础
Oct 21 Python
python分数表示方式和写法
Jun 26 Python
使用Python刷淘宝喵币(低阶入门版)
Oct 30 Python
python中提高pip install速度
Feb 14 Python
Python如何将函数值赋给变量
Apr 28 Python
解决pip install psycopg2出错问题
Jul 09 Python
ROS系统将python包编译为可执行文件的简单步骤
Jul 25 Python
利用Python读取微信朋友圈的多种方法总结
Aug 23 Python
python编程学习使用管道Pipe编写优化代码
Nov 20 Python
详解PyTorch模型保存与加载
Apr 28 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
全国FM电台频率大全 - 13 福建省
2020/03/11 无线电
PHP注释实例技巧
2008/10/03 PHP
PHP 查找字符串常用函数介绍
2012/06/07 PHP
PHP安装threads多线程扩展基础教程
2015/11/17 PHP
php使用自定义函数实现汉字分割替换功能示例
2017/01/30 PHP
PHP实践教程之过滤、验证、转义与密码详解
2017/07/24 PHP
javascript attachEvent和addEventListener使用方法
2009/03/19 Javascript
下载网站打开页面后间隔多少时间才显示下载链接地址的代码
2010/04/25 Javascript
jQuery EasyUI API 中文文档 - ComboTree组合树
2011/10/11 Javascript
js获取指定日期前后的日期代码
2013/08/20 Javascript
js获取当前路径的简单示例代码
2014/01/08 Javascript
实例讲解JQuery中this和$(this)区别
2014/12/08 Javascript
jQuery实现按钮的点击 全选/反选 单选框/复选框 文本框 表单验证
2015/06/25 Javascript
全面解析JavaScript中apply和call以及bind(推荐)
2016/06/15 Javascript
layui分页效果实现代码
2017/05/19 Javascript
Three.js开发实现3D地图的实践过程总结
2017/11/20 Javascript
JS实现关键词高亮显示正则匹配
2018/06/22 Javascript
JavaScript之实现一个简单的Vue示例
2019/01/17 Javascript
微信小程序五子棋游戏AI实现方法【附demo源码下载】
2019/02/20 Javascript
jQuery动态生成的元素绑定事件操作实例分析
2019/05/04 jQuery
浅谈python中get pass用法
2019/03/19 Python
用python写一个定时提醒程序的实现代码
2019/07/22 Python
python 图像处理画一个正弦函数代码实例
2019/09/10 Python
Python优秀开源项目Rich源码解析的流程分析
2020/07/06 Python
Python调用JavaScript代码的方法
2020/10/27 Python
解析浏览器的一些“滚动”行为鉴赏
2019/09/16 HTML / CSS
英国票务网站:Ticketmaster英国
2018/08/27 全球购物
英国泽西岛植物:Jersey Plants Direct
2019/08/07 全球购物
Goodee官方商店:迷你投影仪
2021/03/15 全球购物
《猴子种果树》教学反思
2014/04/26 职场文书
红色故事演讲稿
2014/05/22 职场文书
法人代表任命书范本
2014/06/05 职场文书
不听老师话的万能检讨书
2014/10/04 职场文书
女性健康知识讲座通知
2015/04/23 职场文书
人生哲理妙语30条:淡写流年,笑过人生
2019/09/04 职场文书
使用Ajax实现无刷新上传文件
2022/04/12 Javascript