文章目录
csv模块
csv文件是被行分隔符和列分隔符,分成行和列的文本文件。csv文件是纯文本文件,不指定字符编码
行分隔符:\n,最后一行可以没有换行符
列分隔符:逗号或者制表符,每一行为一条记录record
- 每一行的各个字段可以使用双引号分别包围,也可以不使用双引号包围。
- 如果字段内容中包含了双引号、逗号或者换行符的话,那么字段就必须使用双引号包围,内容中的双引号可以使用
""
的形式来转义
默认使用excel方言
- delimiter 列分隔符
- lineterminator 行分隔符\r\n
- quotechar 字段的引用符号,缺省为
"
双引号 - 双引号的处理
- doublequote,默认为True。如果数据中有双引号,而quotechar也是双引号的话,True表示使用两个双引号来转义此双引号,False表示使用转义字符来转义此双引号
- escapechar一个转义字符,默认为None
writer = csv.writer(f, doublequote=False, escapechar='@')#遇到双引号,就必须提供转义字符
- quoting指定双引号的规则
- QUOTE_ALL所有字段
- QUOTE_MINIMAL特殊字符字段,excel使用此规则
- QUOTE_NONNUMERIC非数字字段
- QUOTE_NONE都不使用双引号
writer(csvfile, dialect='excel', **fmtparams)#返回DictWriter的实例
reader(csvfile, dialect='excel', **fmtparams)#返回reader对象,是一个行迭代器
主要方法
writerow
writerows
writerow(iterable) #writeow()方法后跟可迭代对象
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,那么输出就是\r\n,否则将会是\r\r\n
with open('./test.csv', 'w+', encoding='utf-8', newline='') as f:
writer = csv.writer(f)
writer.writerow(row[0]) #取列表的第一个元素,即('id', 'name', 'age', 'comment')
writer.writerows(row[1:]) #从列表的第二个元素开始取
上面代码运行后,数据结果会输出到test.csv,之后即可使用excel打开查看
csv模块的reader()方法
import csv
with open('test.csv', encoding='utf-8', newline='') as f:
x = csv.reader(f) #读取文件内容,x为惰性对象
for line in x:
print(line)
换行的问题 |
writer()方法:
如果newline设置为None,那么输出的内容会以\n作为换行符;
如果newline是''或者是\n就不做替换,在记录或字段结束后加上换行符;
如果newline是\r\n,就在字符后面加上\n来作为换行符
reader方法:
如果newline为None,那么遇到所有格式的换行符都会进行相应操作,比如,\r,\n\r,\n等,先转换成\n然后再读取;
如果newline为'',遇到所有格式的换行符也会进行换行,不过不会将这些换行符转换成\n之后再读取;
如果newline是\r\n,会在\r\n后面再添加一个\n然后读取,其他换行字符不作处理
结论:
writer()方法和reader()方法最好使用相同的newline值