最近接触到CSV相关的导出需求,考虑到这是一个比较常用的需求,结合自己的一些思考实践,在这儿记录下来分享给大家。
CSV是什么?
按照我的理解,简单来说就是以逗号进行分隔我们的数据,是一种以.csv结尾的文本文件。
维基百科这样的解释:
CSV:逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。
CSV的优点
看了定义我们知道CSV有如下优点:
- 适合存放结构化信息,较为通用(CSV通用标准并不存在)
- 数据体积更小,创建分方便(本身是文本格式对比Excel这一类数据本身带有格式)
- Windows环境下CSV默认打开方式是Excel。
模块介绍
因为这些优点,我们通常把CSV用在各个系统之间进行数据转移,为了方便大家理解及日常使用,我这里分享两种CSV导出的方式。
今天先给大家分享一种CSV导出的方式,也就是用Python内置CSV模块直接进行处理。
由于CSV模块的简单,我们常用模块主要用到 writer及writerow这两个方法。
其中writer方法主要返回一个writer对象,该对象负责在给定的类文件对象上将用户数据转换为带分隔符的字符串。writerow将行参数写入写入器的文件对象,按照当前方言(dialect)进行格式化。
我就不详细介绍更多使用方法了,感兴趣的同学可以参考官方文档或者像我上篇文章那样,调出Alfred输入dash csv调出离线文档所有的资料都有了。参考「私货」你必须拥有的两款神器
当然你也可以用ipython进行shell环境进行查看学习:
一个例子
我们直接上一个CSV文件导出案例。
import csv
import codecs
tests = models.Test.objects.all()
filename = 'test.csv'
with open(filename, 'wb') as test_file:
headers = [ '性别','年龄','身份证',
]
test_file.write(codecs.BOM_UTF8) # 解决乱码问题
csvwriter = csv.writer(test_file, dialect='excel')
csvwriter.writerow(headers)
for test in tests:
test_info = [
str(test.sex),
str(test.age),
str(test.idcard),
]
csvwriter.writerow(test_info)
上面只是一个简单的演示过程,在真实工程化情况中,我们需要考虑CSV导出的耗时问题,定时触发执行等等,所以可能需要加入Celery进行异步任务,执行过程考虑邮件发送带附件等等情况。
另外在上面的代码中需要注意的是,我在在文件中引入了codecs模块,并且添加了test_file.write(codecs.BOM_UTF8)这样一行代码,这个主要是解决Excel打开乱码的问题。
由于时间有限今天暂时给大家介绍第一种导出的情况,下次我们介绍另外一种方式进行CSV的导出,欢迎大家持续关注。