赞
踩
本篇我们介绍如何使用 Python 内置的 csv 模块读取 CSV 文件。
CSV 代表逗号分隔值(comma-separated values),CSV 文件就是使用逗号分隔数据的文本文件。
一个 CSV 文件包含一行或多行数据,每一行数据代表一个记录。每个记录包含一个或多个数值,使用逗号进行分隔。另外,一个 CSV 文件中的所有数据行都包含相同数量的值。
我们通常使用 CSV 文件存储表格数据,很多软件都支持这种文件格式,例如 Microsoft Excel 和 Google Spreadsheet。
在 Python 代码中读取 CSV 文件的步骤如下:
首先,导入 csv 模块:
import csv
其次,使用内置的 open() 函数以读取模式打开文件:
f = open('path/to/csv_file')
如果 CSV 文件中包含 UTF8 编码字符,可以指定 encoding 参数:
f = open('path/to/csv_file', encoding='UTF8')
然后,将文件对象 f 传递给 csv 模块的 reader() 函数,该函数返回一个 csv reader 对象:
csv_reader = csv.reader(f)
csv_reader 是一个可遍历对象,由 CSV 文件中的数据行组成。因此,我们可以使用 for 循环遍历 CSV 文件中的数据行:
for line in csv_reader:
print(line)
每一行都是一个列表,如果想要访问具体的数据,可以使用方括号([])指定数据的下标。第一个数值的下标为 0,第二个数值的下标为 1,依次类推。
例如,以下代码表示访问一行数据中的第一个值:
line[0]
最后,调用 close() 方法关闭文件:
f.close()
或者也可以使用 with 语句自动关闭文件。以下是读取 CSV 文件的完整代码:
import csv
with open('path/to/csv_file', 'r') as f:
csv_reader = csv.reader(f)
for line in csv_reader:
# process each line
print(line)
示例文件 score.csv 的内容如下:
id,stu_id,coursename,coursescore 1,1,English,100 2,1,Math,95 3,2,English,96 4,2,Math,95 5,3,English,100 6,3,Math,99 7,4,English,98 8,4,Math,97 9,5,English,99 10,5,Math,95 11,6,English,96 12,6,Math,94 13,7,English,92 14,7,Math,100 15,8,English,97 16,8,Math,95
下面的示例读取了该文件并打印文件中的内容:
import csv
with open('score.csv', encoding="utf8") as f:
csv_reader = csv.reader(f)
for line in csv_reader:
print(line)
输出结果如下:
['id', 'stu_id', 'coursename', 'coursescore']
['1', '1', 'English', '100']
['2', '1', 'Math', '95']
['3', '2', 'English', '96']
['4', '2', 'Math', '95']
['5', '3', 'English', '100']
...
score.csv 文件中的第一行是标题。为了区分标题和数据,我们可以使用 enumerate() 函数获取每一行的下标:
import csv
with open('score.csv', encoding="utf8") as f:
csv_reader = csv.reader(f)
for line_no, line in enumerate(csv_reader, 1):
if line_no == 1:
print('Header:')
print(line) # header
print('Data:')
else:
print(line) # data
以上示例中,我们使用了 enumerate() 函数并且将第一行的下标设置为 1。在循环内部,如果 line_no 为 1,表示当前行为标题;否则,当前行是数据。代码输出的结果如下:
Header:
['id', 'stu_id', 'coursename', 'coursescore']
Data:
['1', '1', 'English', '100']
['2', '1', 'Math', '95']
['3', '2', 'English', '96']
['4', '2', 'Math', '95']
['5', '3', 'English', '100']
...
跳过标题行的另一个方法就是使用 next() 函数,该函数表示读取到下一行。例如:
import csv
with open('score.csv', encoding="utf8") as f:
csv_reader = csv.reader(f)
# skip the first row
next(csv_reader)
# show the data
for line in csv_reader:
print(line)
以下示例读取 score.csv 文件并计算所有成绩的总和:
import csv
total_score = 0
with open('score.csv', encoding="utf8") as f:
csv_reader = csv.reader(f)
# skip the header
next(csv_reader)
# calculate total
for line in csv_reader:
total_score += int(line[3])
print(total_score)
输出结果如下:
1548
当我们使用 csv.reader() 函数是,可以利用下标访问 CSV 文件中的数据,例如 line[0]、line[1] 等等。不过,使用该函数有两个主要的局限性:
DictReader 类可以解决这些问题,而且它也来自 csv 模块。
DictReader 类可以创建一个类似普通 CSV reader 的对象,但是它将每行数据的信息映射成了一个字典(dict),key 的值由第一行数据指定。
通过使用 DictReader 类,我们可以使用 line[‘stu_id’]、line[‘coursename’] 等方式访问 score.csv 文件中的数据,例如:
import csv
with open('score.csv', encoding="utf8") as f:
csv_reader = csv.DictReader(f)
# show the data
for line in csv_reader:
print(f"The {line['coursename']} score of {line['stu_id']} is {line['coursescore']}")
输出结果如下:
The English score of 1 is 100
The Math score of 1 is 95
The English score of 2 is 96
The Math score of 2 is 95
...
如果我们想要使用自定义的字段名,而不是 CSV 文件中第一行指定的字段名,可以在 DictReader() 构造函数中指定:
import csv
fieldnames = ['id', '学生编号', '课程', '成绩']
with open('score.csv', encoding="utf8") as f:
csv_reader = csv.DictReader(f, fieldnames)
next(csv_reader)
for line in csv_reader:
print(f"The {line['课程']} score of {line['学生编号']} is {line['成绩']}")
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。