CSV(逗号分隔符)文件是表格与数据库操做之中最经常使用的输入输出格式。在RFC4180中的文件描述标准对CSV格式进行规范以前,CSV格式文件就已经被应用了不少年了。而缺少合适的格式描述规范意味着不一样应用的输入输出格式会有着细微的差异。所以在从不一样源生成这些文件的时候,这些差异至关恼人。可是尽管不一样规范的CSV之中,分隔符和引用符千差万别,他们的格式仍是大致类似的,所以制做一个能够高效处理(manipulate)csv文件中的数据同时还能将读写的细节隐去的模块并非什么难事儿。
Python中的CSV模块之中实现了读写CSV格式文件的一些类,他可让你的程序以一种更容易被Excel处理的格式来输出或者读入数据,而没必要纠结于CSV文件的一些麻烦的小细节。并且CSV模块可让你更自由的定制你想要的CSV格式文件。数据库
csv.reader(csvfile, dialect='excel', **fmtparams)
他是读取CSV文件时最经常使用的方法
他的csvfile参数须要一个文件类型的对象,好比:spa
fileObj = open('E:/inputFile.csv','r') csvReader = csv.reader(fileObj)
那么这个方法返回的csvReader就是一个能够按行读取文件的对象。unix
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包含的可选参数就得好好说道说道了。excel
delimiter
这个参数是用来指明分割符的,多数csv文件的分隔符是英文逗号,可是万一有文件整点幺蛾子咋整,好比把英文冒号当分割符,那就要把这个参数指明为:delimiter=':'code
quotechar
这个参数指明了引用符是啥,什么是引用符呢,举个例子,正常状况下,咱们的csv之中的一行多是这个样子的:abc,bcd,cde。就像这样
这没啥问题
可是万一你的csv文件的每有一个表格里记录的是:ab,c,就像这样
这就出事儿了,由于csv当你的一个表格内出现了一个英文逗号,而此时你的分隔符也刚好是英文逗号,那把这玩意关了在打开,那最后岂不是会变成了
这样,为了防止这种状况发生,就须要用引用符了,咱们把ab,c用双引号括起来,告诉程序,这个“ab,c”是一个东西,不准拆分,就能够了。而所以,你能够传入quotechar='xxx'来定义你本身的引用符。对象
quoting
他的功能是指明了引用的模式,首先说,他能够接受几种参数,长得像csv.QUOTE_的参数均可以传进去,好比说csv.QUOTE_NONE,就是告诉程序,个人csv文件里不存在引用符,也就是说,全部的逗号都当作分隔符,无论他在不在引用符里面。blog
doublequote
那么万一咱们的一个表格里自己就即包括一个英文逗号又包括一个双引号,而刚好你的分隔符是英文都好,而引用符也是英文双引号,这不又出事儿了么,就比如,假如你的一个行长这样,
因为第二列里有一个逗号,那就要用引用符把这个东西包起来,而里面又有一个双引号,那这时候匹配双引号的时候就会出错了,而为了防止这种问题的产生,咱们在文件编辑的时候,能够把引用符之中的双引号重复一次,用来表明:这个表格里出现了一次双引号,好比用记事本打开的时候,像这样
这样在csvReader读取文件的时候,他若是碰到了在引用符之中的引用符,会吧连续的两个引用符看作一个双引用符。也就是说用csvReader读取的时候,读取的结果就是会就是
看吧,没错了吧ip
escapechar
doublequote提供了一种,解决若是引用符里出现引用符问题的文件规范,而你也能够本身搞一套解决方案,谁说必需要重复一次啊,烦不烦啊,我就不想敲两次,因而我把doublequote这个参数指定为False,可是仍是要必须指定点啥玩意来完成这个功能的。这就是这个参数的功能。好比说当咱们吧这个参数指定为escapechar=':',而当咱们的输入文件为
那么在用csvReader读取的时候,因为第二个引号有一个冒号前缀,那么读取的时候就会认为,第二个冒号是这个表格内就存在的冒号,不是做为分割符存在的。读取结果与上一个结果同样的。ci
在使用reader的时候后,示例代码以下input
>>> 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'])