在Python的Django框架中生成CSV文件的方法


Posted in Python onJuly 22, 2015

CSV 是一种简单的数据格式,通常为电子表格软件所使用。 它主要是由一系列的表格行组成,每行中单元格之间使用逗号(CSV 是 逗号分隔数值(comma-separated values) 的缩写)隔开。例如,下面是CSV格式的“不守规矩”的飞机乘客表。

Year,Unruly Airline Passengers
1995,146
1996,184
1997,235
1998,200
1999,226
2000,251
2001,299
2002,273
2003,281
2004,304
2005,203
2006,134
2007,147

备注

前面的列表包含真实数据。 这些数据来自美国 联邦航空管理局。

CSV格式尽管看起来简单,却是全球通用的。 但是不同的软件会生成和使用不同的 CSV 的变种,在使用上会有一些不便。 幸运的是, Python 使用的是标准 CSV 库, csv ,所以它更通用。

因为 csv 模块操作的是类似文件的对象,所以可以使用 HttpResponse 替换:

import csv
from django.http import HttpResponse

# Number of unruly passengers each year 1995 - 2005. In a real application
# this would likely come from a database or some other back-end data store.
UNRULY_PASSENGERS = [146,184,235,200,226,251,299,273,281,304,203]

def unruly_passengers_csv(request):
  # Create the HttpResponse object with the appropriate CSV header.
  response = HttpResponse(mimetype='text/csv')
  response['Content-Disposition'] = 'attachment; filename=unruly.csv'

  # Create the CSV writer using the HttpResponse as the "file."
  writer = csv.writer(response)
  writer.writerow(['Year', 'Unruly Airline Passengers'])
  for (year, num) in zip(range(1995, 2006), UNRULY_PASSENGERS):
    writer.writerow([year, num])

  return response

代码和注释可以说是很清楚,但还有一些事情需要特别注意:

  •     响应返回的是 text/csv MIME类型(而非默认的 text/html )。这会告诉浏览器,返回的文档是CSV文件。
  •     响应会有一个附加的 Content-Disposition 头部,它包含有CSV文件的文件名。 这个头部(或者说,附加部分)会指示浏览器弹出对话框询问文件存放的位置(而不仅仅是显示)。 这个文件名是任意的。 它会显示在浏览器的另存为对话框中。
  •     要在HttpResponse指定头部信息,只需把HttpResponse当做字典使用就可以了。
  •     与创建CSV的应用程序界面(API)挂接是很容易的: 只需将 response 作为第一个变量传递给 csv.writer 。 csv.writer 函数需要一个文件类的对象, HttpResponse 正好能达成这个目的。
  •     调用 writer.writerow ,并且传递给它一个类似 list 或者 tuple 的可迭代对象,就可以在 CSV 文件中写入一行。
  •     CSV 模块考虑到了引用的问题,所以您不用担心逸出字符串中引号和逗号。 只要把信息传递给 writerow() ,它会处理好所有的事情。

在任何需要返回非 HTML 内容的时候,都需要经过以下几步: 创建一个 HttpResponse 响应对象(需要指定特殊的 MIME 类型),它它传给需要处理文件的函数,然后返回这个响应对象。

Python 相关文章推荐
对于Python编程中一些重用与缩减的建议
Apr 14 Python
Python NumPy库安装使用笔记
May 18 Python
python批量提取word内信息
Aug 09 Python
使用简单工厂模式来进行Python的设计模式编程
Mar 01 Python
python利用socketserver实现并发套接字功能
Jan 26 Python
python字典快速保存于读取的方法
Mar 23 Python
matplotlib subplots 调整子图间矩的实例
May 25 Python
Django如何自定义分页
Sep 25 Python
python实现字符串加密成纯数字
Mar 19 Python
python 含子图的gif生成时内存溢出的方法
Jul 07 Python
简单介绍django提供的加密算法
Dec 18 Python
JupyterNotebook 输出窗口的显示效果调整实现
Sep 22 Python
在主机商的共享服务器上部署Django站点的方法
Jul 22 #Python
在Lighttpd服务器中运行Django应用的方法
Jul 22 #Python
简单的Apache+FastCGI+Django配置指南
Jul 22 #Python
使用FastCGI部署Python的Django应用的教程
Jul 22 #Python
使用相同的Apache实例来运行Django和Media文件
Jul 22 #Python
在Apache服务器上同时运行多个Django程序的方法
Jul 22 #Python
通过mod_python配置运行在Apache上的Django框架
Jul 22 #Python
You might like
中英文字符串翻转函数
2008/12/09 PHP
PHP 获取ip地址代码汇总
2015/07/05 PHP
PHP 输出缓冲控制(Output Control)详解
2016/08/25 PHP
Laravel的Auth验证Token验证使用自定义Redis的例子
2019/09/30 PHP
推荐dojo学习笔记
2007/03/24 Javascript
My Desktop :) 桌面式代码
2008/12/29 Javascript
jquery 延迟执行实例介绍
2013/08/20 Javascript
关于js里的this关键字的理解
2015/08/17 Javascript
jquery采用oop模式class类的使用示例
2016/01/22 Javascript
js点击按钮实现水波纹效果代码(CSS3和Canves)
2016/09/15 Javascript
JavaScript“尽快失败”的原则实例详解
2016/10/08 Javascript
学习使用jQuery表单验证插件和日历插件
2017/02/13 Javascript
3分钟快速搭建nodejs本地服务器方法运行测试html/js
2017/04/01 NodeJs
ES6生成器用法实例分析
2017/04/10 Javascript
详解在WebStorm中添加Vue.js单文件组件的高亮及语法支持
2017/10/21 Javascript
ES6/JavaScript使用技巧分享
2017/12/14 Javascript
vue调试工具vue-devtools安装及使用方法
2018/11/07 Javascript
基于vue.js组件实现分页效果
2018/12/29 Javascript
浅谈关于vue中scss公用的解决方案
2019/12/02 Javascript
JS实现页面数据懒加载
2020/02/13 Javascript
JavaScript日期库date-fn.js使用方法解析
2020/09/09 Javascript
关于better-scroll插件的无法滑动bug(2021通过插件解决)
2021/03/01 Javascript
[00:21]DOTA2亚洲邀请赛 Logo演绎
2015/02/07 DOTA
通过字符串导入 Python 模块的方法详解
2019/10/27 Python
Python实现把多维数组展开成DataFrame
2019/11/30 Python
jupyter 导入csv文件方式
2020/04/21 Python
Python爬虫防封ip的一些技巧
2020/08/06 Python
Django实现随机图形验证码的示例
2020/10/15 Python
data:image data url 文件转为Blob上传后端的方法
2019/07/16 HTML / CSS
简历中个人自我评价范文
2013/12/26 职场文书
骨干教师考核方案
2014/05/09 职场文书
英语导游词
2015/02/13 职场文书
3招让你摆脱即兴讲话冷场尴尬
2019/08/08 职场文书
Python-typing: 类型标注与支持 Any类型详解
2021/05/10 Python
MySQL query_cache_type 参数与使用详解
2021/07/01 MySQL
使用python绘制横竖条形图
2022/04/21 Python