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 网络编程起步(Socket发送消息)
Sep 06 Python
python从网络读取图片并直接进行处理的方法
May 22 Python
Python对list列表结构中的值进行去重的方法总结
May 07 Python
python3实现ftp服务功能(服务端 For Linux)
Mar 24 Python
Python sklearn KFold 生成交叉验证数据集的方法
Dec 11 Python
对DJango视图(views)和模版(templates)的使用详解
Jul 17 Python
tensorflow-gpu安装的常见问题及解决方案
Jan 20 Python
使用Python防止SQL注入攻击的实现示例
May 21 Python
python小白切忌乱用表达式
May 29 Python
python 对xml解析的示例
Feb 27 Python
Python实现抖音热搜定时爬取功能
Mar 16 Python
 python中的元类metaclass详情
May 30 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 cdata 处理(详细介绍)
2013/07/05 PHP
PHP使用Redis实现Session共享的实现示例
2019/05/12 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
2020/02/27 PHP
document.all的一个比较完整的总结及案例
2013/01/31 Javascript
Jquery对数组的操作技巧整理
2014/03/25 Javascript
简单谈谈javascript代码复用模式
2015/01/28 Javascript
javascript html实现网页版日历代码
2016/03/08 Javascript
JS实现消息来时让网页标题闪动效果的方法
2016/04/20 Javascript
JS实现点击网页判断是否安装app并打开否则跳转app store
2016/11/18 Javascript
javascript常用的设计模式
2017/02/09 Javascript
详解JS异步加载的三种方式
2017/03/07 Javascript
JS实现websocket长轮询实时消息提示的效果
2017/10/10 Javascript
vue2 router 动态传参,多个参数的实例
2017/11/10 Javascript
Vue项目History模式404问题解决方法
2018/10/31 Javascript
vue实现手机号码的校验实例代码(防抖函数的应用场景)
2019/09/05 Javascript
js中apply和call的理解与使用方法
2019/11/27 Javascript
Django框架下在视图中使用模版的方法
2015/07/16 Python
CentOS 7下安装Python 3.5并与Python2.7兼容并存详解
2017/07/07 Python
Python管理Windows服务小脚本
2018/03/12 Python
Centos7 Python3下安装scrapy的详细步骤
2018/03/15 Python
Python wxPython库消息对话框MessageDialog用法示例
2018/09/03 Python
Python构建图像分类识别器的方法
2019/01/12 Python
python调用webservice接口的实现
2019/07/12 Python
python opencv将图片转为灰度图的方法示例
2019/07/31 Python
tensorflow实现对张量数据的切片操作方式
2020/01/19 Python
python多进程下的生产者和消费者模型
2020/05/07 Python
python中常见错误及解决方法
2020/06/21 Python
python+requests实现接口测试的完整步骤
2020/10/27 Python
李维斯法国官网:Levi’s法国
2019/07/13 全球购物
Farfetch阿联酋:奢侈品牌时尚购物平台
2019/07/26 全球购物
英语国培研修感言
2014/02/13 职场文书
十八大标语口号
2014/10/09 职场文书
本科毕业论文答辩稿
2015/06/23 职场文书
公司回复函格式
2015/07/14 职场文书
【海涛DOTA解说】EVE女子战队独家录像加ZSMJ神牛两连发
2022/04/01 DOTA
Nginx动静分离配置实现与说明
2022/04/07 Servers