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 把数据 json格式输出的实例代码
Oct 31 Python
Python实现树的先序、中序、后序排序算法示例
Jun 23 Python
python中hashlib模块用法示例
Oct 30 Python
使用Python 正则匹配两个特定字符之间的字符方法
Dec 24 Python
django的ORM模型的实现原理
Mar 04 Python
Pyinstaller 打包exe教程及问题解决
Aug 16 Python
判断Threading.start新线程是否执行完毕的实例
May 02 Python
python和go语言的区别是什么
Jul 20 Python
Python自动创建Excel并获取内容
Sep 16 Python
pycharm 多行批量缩进和反向缩进快捷键介绍
Jan 15 Python
python中的unittest框架实例详解
Feb 05 Python
python读取excel数据并且画图的实现示例
Feb 08 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学习之php4与php5之间会穿梭一点点感悟
2007/05/03 PHP
PHP批量删除、清除UTF-8文件BOM头的代码实例
2014/04/14 PHP
html静态页面调用php文件的方法
2014/11/13 PHP
PHP封装的完整分页类示例
2018/08/21 PHP
完美解决JS中汉字显示乱码问题(已解决)
2006/12/27 Javascript
本地图片预览(支持IE6/IE7/IE8/Firefox3)经验总结
2013/03/25 Javascript
js中document.write使用过程中的一点疑问解答
2014/03/20 Javascript
jQuery使用andSelf()来包含之前的选择集
2014/05/19 Javascript
javascript关于继承的用法汇总
2014/12/20 Javascript
一个php+js实时显示时间问题
2015/10/12 Javascript
KnockoutJs快速入门教程
2016/05/16 Javascript
Bootstrap实现登录校验表单(带验证码)
2016/06/23 Javascript
JavaScript中清空数组的方法总结
2016/12/02 Javascript
javascript判断回文数详解及实现代码
2017/02/03 Javascript
vue-router实现tab标签页(单页面)详解
2017/10/17 Javascript
小程序ios音频播放没声音问题的解决
2018/07/11 Javascript
微信小程序自定义组件的实现方法及自定义组件与页面间的数据传递问题
2018/10/09 Javascript
vue-cli3.0 脚手架搭建项目的过程详解
2018/10/19 Javascript
[26:52]LGD vs EG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
python获得linux下所有挂载点(mount points)的方法
2015/04/29 Python
使用Python的Flask框架构建大型Web应用程序的结构示例
2016/06/04 Python
关于Python中Inf与Nan的判断问题详解
2017/02/08 Python
python中in在list和dict中查找效率的对比分析
2018/05/04 Python
PyTorch实现更新部分网络,其他不更新
2019/12/31 Python
科茨沃尔德家居商店:Scotts of Stow
2018/06/29 全球购物
维多利亚的秘密官方网站:Victoria’s Secret
2018/10/24 全球购物
Mankind美国/加拿大:英国领先的男士美容护发用品公司
2018/12/05 全球购物
澳大利亚个性化儿童礼品网站:Bright Star Kids
2019/06/14 全球购物
成品仓管员岗位职责
2013/12/11 职场文书
小区消防演习方案
2014/02/21 职场文书
自动化专业大学生职业生涯规划范文:爱拚才会赢
2014/09/12 职场文书
高中学生自我评价范文
2014/09/23 职场文书
小学优秀教师材料
2014/12/15 职场文书
HTML+css盒子模型案例(圆,半圆等)“border-radius” 简单易上手
2021/05/10 HTML / CSS
java泛型通配符详解
2021/07/25 Java/Android
python blinker 信号库
2022/05/04 Python