概述
CSV(逗号分隔符)文件是表格与数据库操作之中最常用的输入输出格式。在RFC4180中的文件描述标准对CSV格式进行规范之前,CSV格式文件就已经被应用了很多年了。而缺乏合适的格式描述规范意味着不同应用的输入输出格式会有着细微的差别。因此在从不同源生成这些文件的时候,这些差别相当恼人。但是尽管不同规范的CSV之中,分隔符和引用符千差万别,他们的格式还是大体相似的,因此制作一个可以高效处理(manipulate)csv文件中的数据同时还能将读写的细节隐去的模块并不是什么难事儿。
Python中的CSV模块之中实现了读写CSV格式文件的一些类,他可以让你的程序以一种更容易被Excel处理的格式来输出或者读入数据,而不必纠结于CSV文件的一些麻烦的小细节。而且CSV模块可以让你更自由的定制你想要的CSV格式文件。
类与方法简介
数据读取
csv.reader(csvfile, dialect='excel', **fmtparams)
他是读取CSV文件时最常用的方法
他的csvfile参数需要一个文件类型的对象,比如:
fileObj = open('E:/inputFile.csv','r')
csvReader = csv.reader(fileObj)
那么这个方法返回的csvReader就是一个可以按行读取文件的对象。可以看到这个方法有三个参数,第一个参数是文件路径没啥好说的,接下来讲解剩余两个参数。
dialect
参数
首先是dialect
:An optional dialect parameter can be given which is used to define a set of parameters specific to a particular CSV dialect.
其实这个看你想以什么规范操作csv文件,可选的参数有三个,分别是excel,excel-tab和unix,基本用不着该这个参数。
fmtparams
参数
然后是fmtparams
,这是个字典类型的参数,其包含的可选参数就得好好说道说道了。
delimiter
这个参数是用来指明分割符的,多数csv文件的分隔符是英文逗号,但是万一有文件整点幺蛾子咋整,比如把英文冒号当分割符,那就要把这个参数指明为:delimiter=':'
quotechar
这个参数指明了引用符是啥,什么是引用符呢,举个例子,正常情况下,我们的csv之中的一行可能是这个样子的:
abc,bcd,cde
用excel打开,就像这样
这没啥问题
但是万一你的csv文件的有一个单元格里记录的是:
ab,c
用excel打开,就像这样
这就出事儿了,因为csv当你的一个单元格内出现了一个英文逗号,而此时你的分隔符也恰好是英文逗号,那把这玩意关了在打开,那这个文件会被解析成下面这样
这样,为了防止这种情况发生,就需要用引用符了,我们把ab,c用双引号括起来,告诉程序,这个“ab,c”
是一个整体,不许拆分,就可以了。而因此,你可以传入quotechar='xxx’来定义你自己的引用符。
quoting
他的功能是指明了引用的模式,首先说,他可以接受几种参数,长得像csv.QUOTE_的参数都可以传进去,比如说csv.QUOTE_NONE,就是告诉程序,我的csv文件里不存在引用符,也就是说,所有的逗号都当做分隔符,不管他在不在引用符里面。
doublequote
那么万一我们的一个表格里本身就即包括一个英文逗号又包括一个双引号,而恰好你的分隔符是英文逗号,而引用符也是英文双引号,这不又出事儿了么,就好比,假如你的一个行长这样。
由于第二列里有一个逗号,那就要用引用符把这个东西包起来,而里面又有一个双引号,那这时候匹配双引号的时候就会出错了,而为了防止这种问题的产生,我们在文件编辑的时候,可以把引用符的双引号重复一次,用来代表:这个单元格里出现了一次双引号。比如用记事本打开的时候,像这样
这样在csvReader读取文件的时候,他如果碰到了在引用符之中的引用符,会吧连续的两个引用符看做一个双引用符。也就是说用csvReader读取的时候,读取的结果就是会就是
看吧,没错了吧
escapechar
doublequote提供了一种,解决如果引用符里出现引用符问题的文件规范,而你也可以自己搞一套解决方案,谁说必须要重复一次啊,烦不烦啊,我就不想敲两次,于是我把doublequote这个参数指定为False,但是还是要必须指定点啥玩意来完成这个功能的。这就是这个参数的功能。比如说当我们吧这个参数指定为escapechar=’:’,而当我们的输入文件为
那么在用csvReader读取的时候,由于第二个引号有一个冒号前缀,那么读取的时候就会认为,第二个冒号是这个表格内就存在的冒号,不是作为分割符存在的。读取结果与上一个结果一样的。
在使用reader的时候后,示例代码如下
>>> import csv
>>> with open('eggs.csv', newline='') as csvfile:
... spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|')
... for row in spamreader:
... print(', '.join(row))
Spam, Spam, Spam, Spam, Spam, Baked Beans
Spam, Lovely Spam, Wonderful Spam
数据写入
csv.writer(csvfile, dialect=‘excel’, **fmtparams)
关键参数与之前一样,反过来理解就好了
写入示例代码如下
import csv
with open('eggs.csv', 'w', newline='') as csvfile:
spamwriter = csv.writer(csvfile, delimiter=' ',
quotechar='|', quoting=csv.QUOTE_MINIMAL)
spamwriter.writerow(['Spam'] * 5 + ['Baked Beans'])
spamwriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])