更多Python标准库内容:刷完这50个标准库模块:没人比我更懂Python了
csv中最重要的两个函数分别是writer
和reader
。考虑到很多人手头可能没有适合学习操作的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
reader
是writer
的逆过程,可以按行读取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']
writer
和reader
中还有quoting
参数,用以设置csv文件中识别引号的方式,其可选参数如下
适用于 | 加引号的字段 | |
---|---|---|
csv.QUOTE_ALL | writer | 所有字段 |
csv.QUOTE_MINIMAL | writer | 包含特殊字符的字段 |
csv.QUOTE_NONNUMERIC | writer reader | 非数字字段 将无引号的字段转为float类型 |
csv.QUOTE_NONE | writer 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.excel | csv.excel_tab | csv.unix_dialect |
---|---|---|---|
delimiter | , | \t | , |
doublequote | True | True | True |
escapechar | None | None | None |
lineterminator | \r\n | \r\n | \r\n |
quotechar | " | " | " |
quoting | 0 | 0 | 1 |
skipinitialspace | False | False | False |
其中,doublequote
为True表示默认双引号,否则为单引号;escapechar
为None表示禁用转义;lineterminator
表示行结尾;quotechar
表示用于包含特殊字符的字符;skipinitialspace
为False则不忽略分隔符之后的空格。
通过register_dialect
和unregister_dialect
可以新建或者取消dialect
,例如
>>>csv.register_dialect('test',delimiter='-',quoting=csv.QUOTE_NONE)
即创建了一个新的dialect,其分割符号为横杠**-**,而引用模式采取QUOTE_NONE。
DictWriter和DictReader
reader
和writer
主要用于按行读写数据,其操作的数据一般是list
这种一维可迭代结构。相比之下,DictWriter
和DictReader
可以更加方便地通过字典来操作数据。
例如
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