CSV读写
CSV(Comma-Separated Values)即逗号分隔值,可以用Excel打开查看。由于是纯文本,任何编辑器也都可打开。与Excel文件不同,CSV文件中:
- 值没有类型,所有值都是字符串
- 不能指定字体颜色等样式
- 不能指定单元格的宽高,不能合并单元格
- 没有多个工作表
- 不能嵌入图像图表
在CSV文件中,以,
作为分隔符,分隔两个单元格。像这样a,,c
表示单元格a
和单元格c
之间有个空白的单元格。依此类推。
举个列子,如下表格:
可以存储为CSV文件,文件内容是:
No.,Name,Age,Score
1,mayi,18,99
2,jack,21,89
3,tom,25,95
4,rain,19,80
上述CSV文件保存为text.csv
1.读文件
为了读取CSV文件,我们需要使用python自带的CSV模块。有两种方法可以使用。
第一种方法使用reader函数,接收一个可迭代的对象(比如csv文件),能返回一个生成器,就可以从其中解析出csv的内容:比如下面的代码可以读取csv的全部内容,以行为单位:
#usr/bin/python
#-*-coding:utf-8-*-
import csv
with open('text.csv','r',encoding='utf-8') as f:
reader=csv.reader(f)
rows=[row for row in reader]
print(rows)
得到:
[['No.', 'Name', 'Age', 'Score'],
['1', 'mayi', '18', '99'],
['2', 'jack', '21', '89'],
['3', 'tom', '25', '95'],
['4', 'rain', '19', '80']]
如果只想提取某一列,我们可以这样做,将上述读取CSV代码中:
rows=[row for row in reader]
#读取第二列
rows=[row[1] for row in reader
这样得到的就是第二列。
注意从csv读出的都是str类型。这种方法要事先知道列的序号,比如Name在第2列,而不能根据'Name'这个标题查询。这时可以采用第二种方法。
第二种方法是使用DictReader,和reader函数类似,接收一个可迭代的对象,能返回一个生成器,但是返回的每一个单元格都放在一个字典的值内,而这个字典的键则是这个单元格的标题(即列头)。用下面的代码可以看到DictReader的结构:
#usr/bin/python
#-*-coding:utf-8-*-
import csv
with open('text.csv','r',encoding='utf-8') as f:
reader_1=csv.DictReader(f)
row_1=[row for row in reader_1]
print(row_1)
得到:
[{'No.': '1', 'Age': '18', 'Score': '99', 'Name': 'mayi'},
{'No.': '2', 'Age': '21', 'Score': '89', 'Name': 'jack'},
{'No.': '3', 'Age': '25', 'Score': '95', 'Name': 'tom'},
{'No.': '4', 'Age': '19', 'Score': '80', 'Name': 'rain'}]
如果我们想用DictReader读取csv的某一列,就可以用列的标题查询,即在上述代码中:
row_1=[row for row in reader_1]
改为:
row_1=[row['Name'] for row in reader_1]
即可得到:
['mayi', 'jack', 'tom', 'rain']
2.写文件
读文件时,我们把csv文件读入列表中,写文件时会把列表中的元素写入到csv文件中。
#usr/bin/python
#-*-coding:utf-8-*-
import csv
with open('text.csv','a',encoding='utf-8',newline = "") as f:
csv_writer = csv.writer(f)
row = ['5','hanmeimei','23','81']
csv_writer.writerow(row)
f.close()
上述代码需要注意的点有:newline='',如果不加这个,在写入内容时会造成行错误,上述代码输出结果为: