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 05 Python
Python的字典和列表的使用中一些需要注意的地方
Apr 24 Python
Python中enumerate()函数编写更Pythonic的循环
Mar 06 Python
如何在python字符串中输入纯粹的{}
Aug 22 Python
详解python分布式进程
Oct 08 Python
python 实现返回一个列表中出现次数最多的元素方法
Jun 11 Python
如何更优雅地写python代码
Jul 02 Python
对django views中 request, response的常用操作详解
Jul 17 Python
python 实现识别图片上的数字
Jul 30 Python
Pytorch 多块GPU的使用详解
Dec 31 Python
python解释器pycharm安装及环境变量配置教程图文详解
Feb 26 Python
深度学习入门之Pytorch 数据增强的实现
Feb 26 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正则提取不包含指定网址的图片地址的例子
2014/04/21 PHP
从零开始学YII2框架(四)扩展插件yii2-kartikgii
2014/08/20 PHP
php实现将HTML页面转换成word并且保存的方法
2016/10/14 PHP
PHP单例模式定义与使用实例详解
2017/02/06 PHP
浅谈thinkphp5 instance 的简单实现
2017/07/30 PHP
用javascript实现读取txt文档的脚本
2007/07/20 Javascript
js验证输入是否为手机号码或电话号码示例
2013/12/30 Javascript
JavaScript中的函数的两种定义方式和函数变量赋值
2014/05/12 Javascript
js中的事件捕捉模型与冒泡模型实例分析
2015/01/10 Javascript
jQuery+css3实现文字跟随鼠标的上下抖动
2015/07/31 Javascript
Bootstrap导航栏各元素操作方法(表单、按钮、文本)
2015/12/28 Javascript
一个简单的JavaScript Map实例(分享)
2016/08/03 Javascript
微信小程序 swiper组件轮播图详解及实例
2016/11/16 Javascript
过期软件破解办法实例详解
2017/01/04 Javascript
原生js实现对Ajax的封装(仿jquery)
2017/01/22 Javascript
JavaScript中利用构造器函数模拟类的方法
2017/02/16 Javascript
angularjs中ng-bind-html的用法总结
2017/05/23 Javascript
把JavaScript代码改成ES6语法不完全指南(分享)
2017/09/10 Javascript
ES6解构赋值的功能与用途实例分析
2017/10/31 Javascript
使用node搭建自动发图文微博机器人的方法
2019/03/22 Javascript
jQuery实现可以扩展的日历
2020/12/01 jQuery
vue el-upload上传文件的示例代码
2020/12/21 Vue.js
python 生成不重复的随机数的代码
2011/05/15 Python
详解PyCharm配置Anaconda的艰难心路历程
2018/08/13 Python
python石头剪刀布小游戏(三局两胜制)
2021/01/20 Python
Python面向对象编程基础实例分析
2020/01/17 Python
tensorflow estimator 使用hook实现finetune方式
2020/01/21 Python
HTML5实现获取地理位置信息并定位功能
2015/04/25 HTML / CSS
欧洲最大的品牌水上运动服装和设备在线零售商:Wuituit Outlet
2018/05/05 全球购物
澳大利亚一站式数码相机商店:CameraPro
2020/03/09 全球购物
SQL Server 2000数据库的文件有哪些,分别进行描述。
2015/11/09 面试题
2014年评职称工作总结
2014/11/20 职场文书
2015年元旦文艺晚会总结(学院)
2014/11/28 职场文书
环保守法证明
2015/06/24 职场文书
MySQL入门命令之函数-单行函数-流程控制函数
2021/04/05 MySQL
react 路由Link配置详解
2021/11/11 Javascript