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装饰器使用示例及实际应用例子
Mar 06 Python
Python中List.count()方法的使用教程
May 20 Python
python如何拆分含有多种分隔符的字符串
Mar 20 Python
Python3数据库操作包pymysql的操作方法
Jul 16 Python
python利用thrift服务读取hbase数据的方法
Dec 27 Python
PyQt5内嵌浏览器注入JavaScript脚本实现自动化操作的代码实例
Feb 13 Python
Python DataFrame一列拆成多列以及一行拆成多行
Aug 06 Python
python中提高pip install速度
Feb 14 Python
利用python生成照片墙的示例代码
Apr 09 Python
python 图像判断,清晰度(明暗),彩色与黑白实例
Jun 04 Python
Python类的继承super相关原理解析
Oct 22 Python
Python 批量下载阴阳师网站壁纸
May 19 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
dedecms采集中可以过滤多行代码的正则表达式
2007/03/17 PHP
ajax 的post方法实例(带循环)
2011/07/04 PHP
详解WordPress中简码格式标签编写的基本方法
2015/12/22 PHP
php使用glob函数遍历文件和目录详解
2016/09/23 PHP
php版微信支付api.mch.weixin.qq.com域名解析慢原因与解决方法
2016/10/12 PHP
基于jquery的图片懒加载js
2010/06/30 Javascript
动感效果的TAB选项卡jquery 插件
2011/07/09 Javascript
表单序列化与jq中的serialize使用示例
2014/02/21 Javascript
详解jQuery移动页面开发中的ui-grid网格布局使用
2015/12/03 Javascript
javascript 数组的定义和数组的长度
2016/06/07 Javascript
javascript运算符——位运算符全面介绍
2016/07/14 Javascript
JS实现iframe自适应高度的方法示例
2017/01/07 Javascript
JS实现css hover操作的方法示例
2017/04/07 Javascript
React+react-dropzone+node.js实现图片上传的示例代码
2017/08/23 Javascript
使用JS动态显示文本
2017/09/09 Javascript
Vuerouter的beforeEach与afterEach钩子函数的区别
2018/12/26 Javascript
Vue filter 过滤当前时间 实现实时更新效果
2019/12/20 Javascript
[06:07]刀塔密之二:攻之吾命受之吾幸
2014/07/03 DOTA
使用python删除nginx缓存文件示例(python文件操作)
2014/03/26 Python
Django框架模板注入操作示例【变量传递到模板】
2018/12/19 Python
详解PyCharm+QTDesigner+PyUIC使用教程
2019/06/13 Python
Python 使用PyQt5 完成选择文件或目录的对话框方法
2019/06/27 Python
OpenCV+python实现实时目标检测功能
2020/06/24 Python
python如何调用java类
2020/07/05 Python
pyspark对Mysql数据库进行读写的实现
2020/12/30 Python
Ted Baker美国官网:英国时尚品牌
2018/10/29 全球购物
外企C语言笔试题
2013/11/10 面试题
简述数组与指针的区别
2014/01/02 面试题
公司年会晚宴演讲稿
2014/01/06 职场文书
《凡卡》教学反思
2014/04/09 职场文书
校庆标语集锦
2014/06/25 职场文书
学校领导班子四风问题整改意见
2014/10/02 职场文书
作风建设整改方案
2014/10/27 职场文书
新员工试用期工作总结2015
2015/05/28 职场文书
导游词之湖北武当山
2019/09/23 职场文书
SQL 聚合、分组和排序
2021/11/11 MySQL