1、csv文件简介
参看 RFC 4180 http://www.ietf.org/rfc/rfc4180.txt
1.1、CSV即逗号分隔值Comma-Separated Values
它是一个被行分隔符、列分隔符划分成行和列的文本文件
CSV 不指定字符编码
每一行称为一条记录record
表头可选,和字段列对齐就行了
1.2、分隔符
行分隔符为\r\n,最后一行可以没有换行符
列分隔符常为逗号或者制表符
1.3、字段
字段可以使用双引号括起来,也可以不使用
如果字段中出现了双引号、逗号、换行符必须使用双引号括起来
如果字段的值是双引号,使用两个双引号表示一个转义
2、csv模块
2.1、reader
2.1.1、语法
csv.reader(csvfile, dialect='excel', **fmtparams) 返回reader对象,是一个行迭代器。
默认使用excel方言,如下:
delimiter 列分隔符 , 逗号
lineterminator 行分隔符 \r\n
quotechar 字段的引用符号,缺省为 " 双引号
双引号的处理
doublequote 双引号的处理,默认为True。如果碰到数据中有双引号,而quotechar也是双
引号,True则使用2个双引号表示,False表示使用转义字符将作为双引号的前缀
escapechar 一个转义字符,默认为None
writer = csv.writer(f, doublequote=False, escapechar='@') 遇到双引号,则必须提供转义字符
quoting 指定双引号的规则
QUOTE_ALL 所有字段
QUOTE_MINIMAL特殊字符字段,Excel方言使用该规则
QUOTE_NONNUMERIC非数字字段
QUOTE_NONE都不使用引号。
2.2、writer
2.2.1、语法
csv.writer(csvfile, dialect='excel', **fmtparams) 返回DictWriter的实例。
主要方法有单行writerow、多行writerows。
2.3、示例
import csv
rows = [
('id', 'name', 'age', 'comment'),
[1, 'tom', 20, 'tom'],
(2, 'jerry', 18, 'jerry'),
(3, 'justin', 22, 'just\t"in'),
"abcdefgh",
((1,), 2, [3])
]
# newline='',表示写入时,不要做\n的替换,那么输出就是\r\n
with open('./test.csv', 'w+', encoding='utf-8', newline='') as f:
writer = csv.writer(f)
writer.writerow(rows[0])
writer.writerows(rows[1:])
# newline='',表示读取时,也不做\n的替换
with open('./test.csv', encoding='utf-8', newline='') as f:
reader = csv.reader(f) # 行迭代器
print(next(reader))
print(next(reader))
for line in reader:
print(line)
# 每一行写入一个可迭代对象,可迭代的每一个元素,将作为csv行中的每一列的元素。
# windows下在会在每行末尾多出一个\r,解决办法 open('test.csv', 'w', newline='')