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 查看文件的编码格式方法
Dec 21 Python
python: line=f.readlines()消除line中\n的方法
Mar 19 Python
用Django写天气预报查询网站
Oct 21 Python
python给微信好友定时推送消息的示例
Feb 20 Python
Python变量访问权限控制详解
Jun 29 Python
python实现的登录与提交表单数据功能示例
Sep 25 Python
TensorFlow实现打印每一层的输出
Jan 21 Python
有关Tensorflow梯度下降常用的优化方法分享
Feb 04 Python
Python 随机生成测试数据的模块:faker基本使用方法详解
Apr 09 Python
基于Python的自媒体小助手---登录页面的实现代码
Jun 29 Python
20行Python代码实现一款永久免费PDF编辑工具的实现
Aug 27 Python
浅析NumPy 切片和索引
Sep 02 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
冰滴咖啡制作步骤
2021/03/03 冲泡冲煮
十天学会php(3)
2006/10/09 PHP
php strcmp使用说明
2010/04/22 PHP
关于php正则匹配汉字的方法介绍
2013/04/25 PHP
对PHP依赖注入的理解实例分析
2016/10/09 PHP
解决php extension 加载顺序问题
2019/08/16 PHP
Laravel 对某一列进行筛选然后求和sum()的例子
2019/10/10 PHP
jQuery formValidator表单验证插件开源了 含API帮助、源码、示例
2008/08/14 Javascript
Jquery优化效率 提升性能解决方案
2010/09/06 Javascript
javascript操作select元素实例分析
2015/03/27 Javascript
JavaScript异步加载问题总结
2018/02/17 Javascript
Vue路由切换时的左滑和右滑效果示例
2018/05/29 Javascript
Next.js项目实战踩坑指南(笔记)
2018/11/29 Javascript
Vue组件之高德地图地址选择功能的实例代码
2019/06/21 Javascript
解决vue更新路由router-view复用组件内容不刷新的问题
2019/11/04 Javascript
JS document form表单元素操作完整示例
2020/01/13 Javascript
vue实现虚拟列表功能的代码
2020/07/28 Javascript
Python3读取zip文件信息的方法
2015/05/22 Python
用Python写王者荣耀刷金币脚本
2017/12/21 Python
Python命令行解析模块详解
2018/02/01 Python
python实现K近邻回归,采用等权重和不等权重的方法
2019/01/23 Python
Python实现Event回调机制的方法
2019/02/13 Python
Python HTML解析模块HTMLParser用法分析【爬虫工具】
2019/04/05 Python
python 回溯法模板详解
2020/02/26 Python
django实现日志按日期分割
2020/05/21 Python
AmazeUI底部导航栏与分享按钮的示例代码
2020/08/18 HTML / CSS
一份全面的PHP面试问题考卷
2012/07/15 面试题
优良学风班申请材料
2014/02/13 职场文书
学生个人自我鉴定
2014/03/26 职场文书
岗位聘任书范文
2014/03/29 职场文书
《红军不怕远征难》教学反思
2014/04/14 职场文书
酒店节能减排方案
2014/05/26 职场文书
学校春季防火方案
2014/06/08 职场文书
语文复习计划
2015/01/19 职场文书
2016年感恩教师节校园广播稿
2015/12/18 职场文书
浅谈如何提高PHP代码质量之端到端集成测试
2021/05/28 PHP