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程序设计有所帮助。

相关文章

  • 在Pycharm中对代码进行注释和缩进的方法详解

    在Pycharm中对代码进行注释和缩进的方法详解

    今天小编就为大家分享一篇在Pycharm中对代码进行注释和缩进的方法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • Python正则表达式教程之二:捕获篇

    Python正则表达式教程之二:捕获篇

    什么是捕获呢?使用小括号指定一个子表达式后,匹配这个子表达式的文本(即匹配的内容)可以在表达式或者其他过程中接着用,下面这篇文章就主要介绍了Python正则表达式中关于捕获的相关资料,需要的朋友可以参考下。
    2017-03-03
  • Python中位运算的详细用法教程

    Python中位运算的详细用法教程

    在Python中,位运算是一种对二进制数进行操作的运算方式,它们直接对二进制位进行操作,而不考虑这些位所表示的实际值,本文将详细介绍Python中的位运算符,需要的朋友可以参考下
    2024-08-08
  • Python 中 list 的各项操作技巧

    Python 中 list 的各项操作技巧

    最近在学习 python 语言。大致学习了 python 的基础语法。觉得 python 在数据处理中的地位和它的 list 操作密不可分,今天把相关基础操作记录到脚本之家平台,需要的的朋友参考下
    2017-04-04
  • python字典各式各样操作从基础到高级全面示例详解

    python字典各式各样操作从基础到高级全面示例详解

    在Python中,字典(Dictionary)是一种强大而灵活的数据结构,它允许你存储和检索键值对,本文将深入探讨Python中各式各样的字典操作,包括基本操作、高级操作以及一些实用的技巧,通过全面的示例代码,将展示如何充分发挥字典在Python编程中的优势
    2023-12-12
  • 如何用python做逐步回归

    如何用python做逐步回归

    这篇文章主要介绍了如何用python 做逐步回归,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
    2021-04-04
  • python数据类型的详细分析(附示例代码)

    python数据类型的详细分析(附示例代码)

    这篇文章主要给大家介绍了关于python数据类型分析的相关资料,python里可以通过type()函数来查看数据类型,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-09-09
  • Python通过psd-tools解析PSD文件

    Python通过psd-tools解析PSD文件

    这篇文章主要介绍了Python通过psd-tools解析PSD文件,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下
    2022-06-06
  • Python判断对象是否相等及eq函数的讲解

    Python判断对象是否相等及eq函数的讲解

    今天小编就为大家分享一篇关于Python判断对象是否相等及eq函数的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • 一文带你解决Python中的所有报错

    一文带你解决Python中的所有报错

    使用Python进行代码编程的时候,难免会遇到代码报错,不仅仅是新手小白会遇到,就是很多编程大神也是经常出现BUG的,下面这篇文章主要给大家介绍了关于解决Python中所有报错的相关资料,需要的朋友可以参考下
    2023-03-03

最新评论