python读写csv文件

更多Python标准库内容:刷完这50个标准库模块:没人比我更懂Python了

csv中最重要的两个函数分别是writerreader。考虑到很多人手头可能没有适合学习操作的csv文件,所以对csv模块的学习从writer开始。

writer

>>> import csv
>>> data = [[i*j for j in range(5)] for i in range(5)]
>>> f = open('test.csv','w')    #以写模式打开`test.csv`
>>> with f:             # with可以在程序段结束后自动close
...   w = csv.writer(f) 
...   for row in data:
...     w.writerow(row) #按行写入`row`

从而我们新建了一个csv文件,其内容如下。

0,0,0,0,0

0,1,2,3,4

0,2,4,6,8

0,3,6,9,12

0,4,8,12,16

delimiter参数用于更改列之间的分割符号,默认为,,若将w写为w=csv.writer(f,delimiter=' '),则得到的csv文件内容为

0 0 0 0 0

0 1 2 3 4

0 2 4 6 8

0 3 6 9 12

0 4 8 12 16

reader

readerwriter的逆过程,可以按行读取csv中的数据

>>> f = open('test.csv','r') #通过r模式打开刚刚创建的csv
>>> with f:
...   r = csv.reader(f) 
...   for row in r:
...     print(row)
...
['0', '0', '0', '0', '0']
[]
['0', '1', '2', '3', '4']
[]
['0', '2', '4', '6', '8']
[]
['0', '3', '6', '9', '12']
[]
['0', '4', '8', '12', '16']

writerreader中还有quoting参数,用以设置csv文件中识别引号的方式,其可选参数如下

适用于加引号的字段
csv.QUOTE_ALLwriter所有字段
csv.QUOTE_MINIMALwriter包含特殊字符的字段
csv.QUOTE_NONNUMERICwriter
reader
非数字字段
将无引号的字段转为float类型
csv.QUOTE_NONEwriter
reader
不适用引号
不处理引号字符

dialect

csv是一种简单的文件格式,但仍然需要一些设置,比如分隔符以及处理引号的方式等。dialect便是对某些处理方式的集成,csv.reader中默认的dialect为excel,便相当于声明了使用逗号,作为分隔符。

通过list_dialects可以获取当前已经定义的dialect

>>> csv.list_dialects()
['excel', 'excel-tab', 'unix']

这三种dialect分别对应三个已经封装好的类:excel, excel_tab, unix_dialect,其各项参数如下

成员变量csv.excelcsv.excel_tabcsv.unix_dialect
delimiter,\t,
doublequoteTrueTrueTrue
escapecharNoneNoneNone
lineterminator\r\n\r\n\r\n
quotechar"""
quoting001
skipinitialspaceFalseFalseFalse

其中,doublequote为True表示默认双引号,否则为单引号;escapechar为None表示禁用转义;lineterminator表示行结尾;quotechar表示用于包含特殊字符的字符;skipinitialspace为False则不忽略分隔符之后的空格。

通过register_dialectunregister_dialect可以新建或者取消dialect,例如

>>>csv.register_dialect('test',delimiter='-',quoting=csv.QUOTE_NONE)

即创建了一个新的dialect,其分割符号为横杠**-**,而引用模式采取QUOTE_NONE。

DictWriter和DictReader

readerwriter主要用于按行读写数据,其操作的数据一般是list这种一维可迭代结构。相比之下,DictWriterDictReader可以更加方便地通过字典来操作数据。

例如

dct = [{str(j):i*j for j in range(5)} for i in range(5)]
for i in dct:
	print(i)

打印结果如下

在这里插入图片描述

则通过DictWriter可将dct写入csv中,以key为每一列的标题,以value为某行对应标题的值。

>>> with open('dict.csv', 'w', newline='') as csvfile:
...   titles = list(dct[0].keys())
...   w = csv.DictWriter(csvfile,fieldnames=titles)
...   for kw in dct:
...     w.writerow(kw)

dict.csv内容为


0,0,0,0,0
0,1,2,3,4
0,2,4,6,8
0,3,6,9,12
0,4,8,12,16


  • 12
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微小冷

请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值