csv 模块的基本使用

csv 模块专门用于读取和写入 csv 文件内容python

如下主要讲在 python2 中的使用,在python3中有不一样的地方,我会单独指出来vim

通常的excel表格能够保存为csv格式,而后就能够使用 csv 模块去处理了app

读取文件

读取文件经过 csv.reader() 方法
须要注意,在python2中,打开和写 csv 文件,使用 rb 和 wb
但在python3中,打开和写 csv 文件,使用 r 和 w
并且 python2 和 python3 在csv文件中遇到中文时的状况也不同,具体见后面有关中文问题的介绍
 1 import csv
 2  
 3 f = open("tmp.csv", "rb")
 4 # 这里得到的 csvreader 变量其实是一个迭代器,也就是不能直接打印,须要经过for循环或者next()方法读取,且只能读取一次
 5 csvreader = csv.reader(f)
 6 for row in csvreader:
 7     # 这里的 row 为一个列表,每一个字段为这个列表的一个元素,注意,每一个字段都是字符串类型
 8     # 为了保证每一个字段的值先后没有空字符,能够使用以下方法将其处理之后得到新的列表
 9     new_row = []
10     for i in row:
11         new_row.append(i.strip())

写文件

写文件经过csv.writer() 方法,
若是要一次写入一行,能够使用 writerow() 方法;若是要一次写多行,能够使用 writerows()
以下例:
 1 f = open("tmp.csv", 'wb')
 2 # 虽然读取出来都是字符串,可是写入时,能够是其余类,因此这里的3能够是数值,读取该文件时仍是会都变成字符串
 3 a = [["a","1"],["b","2"],["c",3]]
 4 csvwriter = csv.writer(f)
 5  
 6 for i in a:
 7     # 一次写入一行
 8     csvwriter.writerow(i)
 9  
10 # 一次写入多行
11 csvwriter.writerows([["d", 4], ["e", 5]])
12 f.close()

定义格式

定义格式的方法 register_dialect()
有不少格式能够定义,用的最多的是delimiter ,分隔符,默认是逗号
能够自定义其余格式:
  1 csv.register_dialect("mydialect", delimiter="|") 
定义一个格式,命名为mydialect,分隔符设定为 "|"
应用自定义格式的方式以下:
1 # 读文件时应用,读取文件时,按 "|" 分隔
2 f = open("tmp1.csv","rb")
3 lines = csv.reader(f, "mydialect")
4  
5 # 写文件时应用,写文件时,按 "|" 分隔
6 f = open("tmp1.csv","wb")
7 csvwriter = csv.writer(f, "mydialect") 

中文问题

不管是python2,仍是python3,不管是读仍是写,都会遇到中文的问题
 
在python2中
读取文件时,若是原文件不是 utf-8 的编码格式(事实上,使用excel建立的csv文件,编码格式通常为gbk),则输出来的中文相似这种格式 '\xb2\xe2\xca\xd4',能够对该字符串使用decode("gbk")解码便可得到中文信息
 
写文件时,若是内容有中文,代码不会出问题,可是写出来的文件是utf-8的编码格式,使用vim和cat通常不会出问题,可是使用excel打开时,中文会显示乱码
可是写出的该 csv 文件,使用 csv 模块打开时就能够正常显示,为utf-8的编码格式
 
若是但愿写出的带中文的 csv 文件能够被 excel 正常读取,能够使用codecs模块
1 import csv
2 import codecs
3  
4 f = codecs.open("tmp1.csv", "w", "utf_8_sig")
5 csvw = csv.writer(f)
6 csvw.writerows([["中国","中文"],["abc","中文"]])
7 f.close()

这种方法写的csv文件,在excel中也能正常显示中文,并且文件编码为utf-8函数

可是该csv文件使用csv模块打开时,会在第一个字段前加上 "\ufeff" 标记,在作字符串对比的时候须要注意这一点
>>> f = open("tmp1.csv", "r")
>>> csvr = csv.reader(f)
>>> next(csvr)
['\ufeff中国', '中文']
>>> next(csvr)
['abc', '中文']

在python3中,编码

读取非 utf-8 编码格式带中文的csv文件时,则直接报错
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb2 in position 0: invalid start byte

但python3中有个很好的方式来解决这个问题spa

python3中,open函数有一个encoding参数,能够指定文件的编码格式,注意,这是python2中没有的excel

因此,在读取 gbk 编码格式的 csv 文件时,能够使用以下方法
>>> f = open("tmp2.csv","r", encoding="gbk")
>>> csvr = csv.reader(f)
>>> a = next(csvr)
>>> a[0]
'中文1'
>>> a[0] == '中文1'
True

注意,这里得到的中文是否是 gbk 编码,而是 unicode 编码,能够直接和 unicode 编码的中文进行比较code

 
写带中文的csv文件时,也能够使用这种方式打开
>>> f = open("tmp3.csv", "w", encoding="gbk")
>>> csvw = csv.writer(f)
>>> csvw.writer([["中文1", "中文2"],["a","中文3"]])
>>> f.close()

这里建立的tmp3.csv文件是 gbk 编码格式,能够使用excel正常查看,但可能使用vim和cat查看时是乱码blog

vim能够更改vimrc中的fileencodings的值,来正常查看gbk格式的中文,具体方法这里就不介绍了ip

事实上,若是写文件时若是open函数不添加encoding参数,上面介绍的 python2 中的写方法一样适用于 python3
相关文章
相关标签/搜索