Python入门教程第72篇 读取CSV文件

Posted 不剪发的Tony老师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python入门教程第72篇 读取CSV文件相关的知识,希望对你有一定的参考价值。

本篇我们介绍如何使用 Python 内置的 csv 模块读取 CSV 文件。

CSV 文件

CSV 代表逗号分隔值(comma-separated values),CSV 文件就是使用逗号分隔数据的文本文件。

一个 CSV 文件包含一行或多行数据,每一行数据代表一个记录。每个记录包含一个或多个数值,使用逗号进行分隔。另外,一个 CSV 文件中的所有数据行都包含相同数量的值。

我们通常使用 CSV 文件存储表格数据,很多软件都支持这种文件格式,例如 Microsoft Excel 和 Google Spreadsheet。

读取 CSV 文件

在 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

DictReader 类

当我们使用 csv.reader() 函数是,可以利用下标访问 CSV 文件中的数据,例如 line[0]、line[1] 等等。不过,使用该函数有两个主要的局限性:

  • 首先,访问数据的方式不明显。例如,line[3] 代表了成绩。如果我们能够使用 line[‘coursescore’] 访问数据,显然含义更加清晰。
  • 其次,当 CSV 文件中的字段顺序发生了改变,或者增加了新的字段,我们需要修改代码。

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['成绩']")

总结

  • csv.reader() 函数和 csv.DictReader 类都可以用于读取 CSV 文件。

以上是关于Python入门教程第72篇 读取CSV文件的主要内容,如果未能解决你的问题,请参考以下文章

Python入门教程第68篇 读取文本文件

Python读取mat文件-转csv文件

python读取csv出错怎么解决

超简单的Python教程系列——第12篇:文件处理

如何通过读取shell脚本中的csv文件来将2列的总和添加到新列中

Python遥感图像处理应用篇(十四):GDAL 读取多光谱数据为二维数组并存入csv文件