python django下载大的csv文件实现方法分析

 更新时间:2019年07月19日 11:41:35   作者:zhaozhi406  
这篇文章主要介绍了python django下载大的csv文件实现方法,结合实例形式分析了Django框架下载csv大文件的相关操作技巧与注意事项,需要的朋友可以参考下

本文实例讲述了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基础之并发编程(二)

    这篇文章主要介绍了详解python的并发编程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-10-10
  • 详解python 爬取12306验证码

    详解python 爬取12306验证码

    这篇文章主要介绍了python爬取12306验证码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • wxPython窗体拆分布局基础组件

    wxPython窗体拆分布局基础组件

    这篇文章主要为大家详细介绍了wxPython窗体拆分布局基础组件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • python笔记之使用fillna()填充缺失值

    python笔记之使用fillna()填充缺失值

    这篇文章主要介绍了python笔记之使用fillna()填充缺失值方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • 解决Ubuntu18中的pycharm不能调用tensorflow-gpu的问题

    解决Ubuntu18中的pycharm不能调用tensorflow-gpu的问题

    这篇文章主要介绍了解决Ubuntu18中的pycharm不能调用tensorflow-gpu的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 解决keras GAN训练是loss不发生变化,accuracy一直为0.5的问题

    解决keras GAN训练是loss不发生变化,accuracy一直为0.5的问题

    这篇文章主要介绍了解决keras GAN训练是loss不发生变化,accuracy一直为0.5的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • Python搭建监控平台的实现示例

    Python搭建监控平台的实现示例

    本文主要介绍了Python搭建监控平台的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Pytorch中的variable, tensor与numpy相互转化的方法

    Pytorch中的variable, tensor与numpy相互转化的方法

    这篇文章主要介绍了Pytorch中的variable, tensor与numpy相互转化的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • python Django模板的使用方法(图文)

    python Django模板的使用方法(图文)

    模板通常用于产生HTML,但是Django的模板也能产生任何基于文本格式的文档。
    2013-11-11
  • JSONLINT:python的json数据验证库实例解析

    JSONLINT:python的json数据验证库实例解析

    本文介绍的 jsonlint 启发自 python 的表单验证工具 wtforms,wtforms 通过继承 Form 类也能进行 json 数据验证,下面通过一些例子给大家详细介绍,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-11-11

最新评论