更多Python标准库内容:刷完这50个标准库模块:没人比我更懂Python了
csv中最重要的两个函数分别是writer
和reader
。考虑到很多人手头可能没有适合学习操作的csv
文件,所以对csv模块的学习从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
是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 |
不适用引号 不处理引号字符 |
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
。
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)
...
{'0': 0, '1': 0, '2': 0, '3': 0, '4': 0}
{'0': 0, '1': 1, '2': 2, '3': 3, '4': 4}
{'0': 0, '1': 2, '2': 4, '3': 6, '4': 8}
{'0': 0, '1': 3, '2': 6, '3': 9, '4': 12}
{'0': 0, '1': 4, '2': 8, '3': 12, '4': 16}
则通过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