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中dir函数用法分析
Apr 17 Python
Python 多线程抓取图片效率对比
Feb 27 Python
numpy matrix和array的乘和加实例
Jun 28 Python
如何用Python合并lmdb文件
Jul 02 Python
教你利用Python玩转histogram直方图的五种方法
Jul 30 Python
Apache,wsgi,django 程序部署配置方法详解
Jul 01 Python
python实现大文件分割与合并
Jul 22 Python
PIL对上传到Django的图片进行处理并保存的实例
Aug 07 Python
Python如何设置指定窗口为前台活动窗口
Aug 12 Python
python 5个实用的技巧
Sep 27 Python
用Python制作灯光秀短视频的思路详解
Apr 13 Python
Python实现批量将文件复制到新的目录中再修改名称
Apr 12 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注入实例
2006/10/09 PHP
php UTF8 文件的签名问题
2009/10/30 PHP
php常用ODBC函数集(详细)
2013/06/24 PHP
PHP实现的比较完善的购物车类
2014/12/02 PHP
Js判断CSS文件加载完毕的具体实现
2014/01/17 Javascript
JQuery+Ajax无刷新分页的实例代码
2014/02/08 Javascript
js过滤特殊字符输入适合输入、粘贴、拖拽多种情况
2014/03/22 Javascript
jQuery学习笔记之 Ajax操作篇(二) - 数据传递
2014/06/23 Javascript
谷歌地图打不开的解决办法
2014/08/07 Javascript
jQuery中height()方法用法实例
2014/12/24 Javascript
JS实现当前页居中分页效果的方法
2015/06/18 Javascript
swtich/if...else的替代语句
2015/08/16 Javascript
分享jQuery封装好的一些常用操作
2016/07/28 Javascript
微信小程序 删除项目工程实现步骤
2016/11/10 Javascript
JS实现小球的弹性碰撞效果
2017/11/11 Javascript
微信小程序实现团购或秒杀批量倒计时
2020/11/01 Javascript
vue-router 手势滑动触发返回功能
2018/09/30 Javascript
vue 组件中使用 transition 和 transition-group实现过渡动画
2019/07/09 Javascript
Javascript实现秒表计时游戏
2020/05/27 Javascript
Python面向对象编程中的类和对象学习教程
2015/03/30 Python
python操作mongodb根据_id查询数据的实现方法
2015/05/20 Python
python实现的简单RPG游戏流程实例
2015/06/28 Python
python使用正则表达式替换匹配成功的组并输出替换的次数
2017/11/22 Python
Python+selenium 获取一组元素属性值的实例
2018/06/22 Python
Django配置celery(非djcelery)执行异步任务和定时任务
2018/07/16 Python
Python通过for循环理解迭代器和生成器实例详解
2019/02/16 Python
由Python编写的MySQL管理工具代码实例
2019/04/09 Python
详解pandas中MultiIndex和对象实际索引不一致问题
2019/07/23 Python
css3进行截取替代js的substring
2013/09/02 HTML / CSS
香港优质食材和美酒专门店:FoodWise
2017/09/01 全球购物
来自世界各地的饮料:Flavourly
2019/05/06 全球购物
国家励志奖学金获奖感言
2014/01/09 职场文书
大学总结自我鉴定
2014/01/18 职场文书
创业计划实施的7大步骤
2014/02/05 职场文书
会计试用期自我评价怎么写
2014/09/18 职场文书
Java实现超大Excel文件解析(XSSF,SXSSF,easyExcel)
2022/07/15 Java/Android