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 相关文章推荐
ptyhon实现sitemap生成示例
Mar 30 Python
在Python中使用元类的教程
Apr 28 Python
Python对列表中的各项进行关联详解
Aug 15 Python
python 中的divmod数字处理函数浅析
Oct 17 Python
Python操作json的方法实例分析
Dec 06 Python
python操作openpyxl导出Excel 设置单元格格式及合并处理代码实例
Aug 27 Python
Python3 tkinter 实现文件读取及保存功能
Sep 12 Python
详解python中的闭包
Sep 07 Python
Pycharm中使用git进行合作开发的教程详解
Nov 17 Python
为2021年的第一场雪锦上添花:用matplotlib绘制雪花和雪景
Jan 05 Python
python 中 .py文件 转 .pyd文件的操作
Mar 04 Python
Python线程池与GIL全局锁实现抽奖小案例
Apr 13 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
解析使用substr截取UTF-8中文字符串出现乱码的问题
2013/06/20 PHP
PHP输出缓冲控制Output Control系列函数详解
2015/07/02 PHP
Symfony控制层深入详解
2016/03/17 PHP
PHP如何实现跨域
2016/05/30 PHP
PHP上传图片到数据库并显示的实例代码
2019/12/20 PHP
强制设为首页代码
2006/06/19 Javascript
jquery 插件学习(二)
2012/08/06 Javascript
jQuery中delegate和on的用法与区别详细解析
2014/01/26 Javascript
网页收藏夹显示ICO图标(代码少)
2015/08/04 Javascript
微信小程序 scroll-view组件实现列表页实例代码
2016/12/14 Javascript
BootStrap Fileinput初始化时的一些参数
2016/12/30 Javascript
JavaScript 字符串数字左补位,右补位,取固定长度,截位扩展函数代码
2017/03/25 Javascript
Vue.use源码分析
2017/04/22 Javascript
Vue中v-for的数据分组实例
2018/03/07 Javascript
JavaScript实现的反序列化json字符串操作示例
2018/07/18 Javascript
layer弹出层 iframe层去掉滚动条的实例代码
2018/08/17 Javascript
jquery.pager.js实现分页效果
2019/07/29 jQuery
简介JavaScript错误处理机制
2020/08/04 Javascript
Django的session中对于用户验证的支持
2015/07/23 Python
Python基于pygame实现图片代替鼠标移动效果
2015/11/11 Python
Python 中的with关键字使用详解
2016/09/11 Python
提升Python效率之使用循环机制代替递归函数
2019/07/23 Python
Python 画出来六维图
2019/07/26 Python
python实现画循环圆
2019/11/23 Python
python图形开发GUI库pyqt5的详细使用方法及各控件的属性与方法
2020/02/14 Python
Python 实现自动完成A4标签排版打印功能
2020/04/09 Python
Pycharm激活方法及详细教程(详细且实用)
2020/05/12 Python
解决Alexnet训练模型在每个epoch中准确率和loss都会一升一降问题
2020/06/17 Python
机电工程学生自荐信范文
2013/12/07 职场文书
成功经营餐厅的创业计划书范文
2013/12/26 职场文书
会计专业毕业生求职信
2014/07/04 职场文书
关于清明节的演讲稿
2014/09/13 职场文书
学雷锋活动简报
2015/07/20 职场文书
2016幼儿教师自荐信范文
2016/01/28 职场文书
《窃读记》教学反思
2016/02/18 职场文书
CSS3实现模糊背景的三种效果示例
2021/03/30 HTML / CSS