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 获取进程pid号的方法
Mar 10 Python
用Python编写生成树状结构的文件目录的脚本的教程
May 04 Python
Python 文件管理实例详解
Nov 10 Python
详解Python中的Descriptor描述符类
Jun 14 Python
Python中支持向量机SVM的使用方法详解
Dec 26 Python
关于PyTorch 自动求导机制详解
Aug 18 Python
django使用JWT保存用户登录信息
Apr 22 Python
Django 5种类型Session使用方法解析
Apr 29 Python
小 200 行 Python 代码制作一个换脸程序
May 12 Python
详解Django中异步任务之django-celery
Nov 05 Python
pandas将list数据拆分成行或列的实现
Dec 13 Python
通过python-pptx模块操作ppt文件的方法
Dec 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 过滤器实现代码
2010/08/09 PHP
Thinkphp关闭缓存的方法
2015/06/26 PHP
php商品对比功能代码分享
2015/09/24 PHP
浅析Laravel5中队列的配置及使用
2016/08/04 PHP
jQuery 处理网页内容的实现代码
2010/02/15 Javascript
通过jQuery源码学习javascript(二)
2012/12/27 Javascript
js判断是否按下了Shift键的方法
2015/01/27 Javascript
javascript等号运算符使用详解
2015/04/16 Javascript
学习JavaScript设计模式之状态模式
2016/01/08 Javascript
JS编写函数实现对身份证号码最后一位的验证功能
2016/12/29 Javascript
jQuery实现的简单拖动层示例
2017/02/22 Javascript
node.js 利用流实现读写同步,边读边写的方法
2017/09/11 Javascript
JavaScript模板引擎实现原理实例详解
2018/12/14 Javascript
JavaScript中的 new 命令
2019/05/22 Javascript
Vue实现PC端靠边悬浮球的代码
2020/05/09 Javascript
[47:45]DOTA2-DPC中国联赛 正赛 Phoenix vs Dragon BO3 第一场 2月26日
2021/03/11 DOTA
python getopt 参数处理小示例
2009/06/09 Python
详解Python中的join()函数的用法
2015/04/07 Python
python+matplotlib演示电偶极子实例代码
2018/01/12 Python
Flask框架配置与调试操作示例
2018/07/23 Python
python单例模式获取IP代理的方法详解
2018/09/13 Python
Pytorch 扩展Tensor维度、压缩Tensor维度的方法
2020/09/09 Python
html5的自定义data-*属性与jquery的data()方法的使用
2014/07/02 HTML / CSS
10个最常见的HTML5面试题 附答案
2016/06/06 HTML / CSS
印度尼西亚最大的电商平台:Tokopedia(印尼版淘宝)
2017/12/02 全球购物
排序都有哪几种方法?请列举。用JAVA实现一个快速排序
2014/02/16 面试题
大学生的四年学习自我评价
2013/12/13 职场文书
工作表扬信的范文
2014/01/10 职场文书
十佳大学生事迹材料
2014/01/29 职场文书
个人求职信范例
2014/01/29 职场文书
革命先烈的英雄事迹材料
2014/02/15 职场文书
饭店服务员岗位职责
2015/02/09 职场文书
2015年公司保安年终工作总结
2015/05/14 职场文书
党支部培养考察意见
2015/06/02 职场文书
给校长的建议书作文300字
2015/09/14 职场文书
Python pygame实现中国象棋单机版源码
2021/06/20 Python