使用 Python 读取和处理 CSV 文件。
逗号分隔值文件(或 CSV 文件)是用于存储表格数据的最流行的文件类型。为什么您要用 Python 读取 CSV 文件?也许您的编程之旅已经将您带到了需要处理文件的地步。或者您可能想对从 IoT 传感器收集的数据执行计算。
在 Python 中处理 CSV 文件的最简单方法是使用 pandas pandas 。 从那里,你可以进一步处理数据并将 其可视化 .
但这不是唯一的方法。如果您有理由依赖纯 Python 方式,请按照以下方法操作!
将 CSV 文件读入列表列表
假设您正在处理班级考试的数据。您有姓名和成绩,并且想要计算班级平均分。为简单起见,我们假设成绩范围从 1(最差)到 6(最好)。我们在名为 的文件中拥有以下格式的数据
data.csv
:
id,student,grade
1,John,4
2,Emily,5
3,Emma,3
...
可以用一张表来表示:
ID | 学生 | 年级 | ||
1 | 约翰 | 4 | ||
2 | 艾米丽 | 5 | ||
3 | 艾玛 | 3 | ||
... |
如您所见,它使用逗号作为分隔符,并且我们有一个标题行。了解了所有这些,让我们编写代码吧!
>>> import csv
>>>
>>> file = open("data.csv", "r")
>>> data = list(csv.reader(file, delimiter=","))
>>> file.close()
>>>
>>> print(data)
[['id', 'student', 'grade'], ['1', 'John', '4'], ['2', 'Emily', '5'], ['3', 'Emma', '3'], ['4', 'Patricia', '5'], ['5', 'James', '2'], ['6', 'Michael', '4'], ['7', 'David', '3'], ['8', 'Linda', '5'], ['9', 'Andrew', '5'], ['10', 'Mary', '6'], ['11', 'Kevin', '6'], ['12', 'Barbara', '1'], ['13', 'George', '1'], ['14', 'Peter', '3'], ['15', 'Zach', '4'], ['16', 'Susan', '4'], ['17', 'Lisa', '4'], ['18', 'Tim', '4.5']]
基本上就是这样!让我们逐行检查一下脚本。
在第一行中,我们导入
csv
模块。然后我们以读取模式打开文件并将文件句柄分配给变量
file
。
接下来,我们使用 处理打开的文件
csv.reader()
。我们只需要指定第一个参数,,
iterable
并指定逗号作为分隔符。正如您可能从第一个参数的名称中了解到的那样,它期望接收一个可迭代对象,因此您也可以传递 CSV 行列表(作为文本)。当我们传递文件句柄时,
csv.reader()
将其视为可迭代对象并逐行读取整个文件。
csv.reader()
还返回一个可迭代对象。可以将其视为一个数据链,逐个访问,并且只能访问一次。要了解整体情况并更熟练地使用可迭代对象,请查看文章“
Python 中的
组合
简介
”。
要将可迭代对象转换为列表,我们需要用 包装整个表达式
list()
。如果您处理大量数据,
请不要这样做
,因为您的设备可能会耗尽 RAM。要
成为处理大型 CSV 文件的专家
,请查看我们的“
如何在 Python 中读取和写入 CSV 文件”
课程。在课程中,您还将学习如何创建和编写自己的 CSV 文件。
最后,一旦我们读取了整个文件并且不再需要它,我们就可以安全地用 关闭它
file.close()
。请注意,如果您决定坚持使用迭代器并在关闭后尝试使用它们,则会收到 I/O 错误。
计算平均值
要手动计算平均分,我们需要两个值:所有成绩的总和和成绩的数量。幸运的是,Python 附带了用于这两项任务的函数。
让我们首先从数据中提取成绩。
>>> [row[2] for row in data]
['grade', '4', '5', '3', '5', '2', '4', '3', '5', '5', '6', '6', '1', '1', '3', '4', '4', '4', '4.5']
我们在这里使用了一种称为列表推导的结构。如果你不熟悉这种语法, Marija 写了一篇关于它的文章, check it out !
但我们的成绩看起来不对。我们有两个问题需要解决。首先,我们把标题留在了数据中。其次,我们无法计算字符串的平均值,因此我们需要将它们转换为浮点数。
为了解决第一个问题,我们使用索引切片并跳过第一行。这意味着我们写
data[1:]
而不是简单地
data
。然后,我们
row[2]
用
float()
函数包装以获取可以使用的数字。
我们还可以使用一些映射和过滤器。听起来很神秘?如果我们成功激起了你的兴趣,请查看 Xavier 的文章“ Map、Filter 和 Reduce – 使用 Python 处理流 ”。
附注:书写
row[2]
不是最漂亮的解决方案。很明显,我们从第三列获取值,但我们稍后会在文章中回到这一点以
使用列名
.
>>> [float(row[2]) for row in data[1:]]
[4.0, 5.0, 3.0, 5.0, 2.0, 4.0, 3.0, 5.0, 5.0, 6.0, 6.0, 1.0, 1.0, 3.0, 4.0, 4.0, 4.0, 4.5]
啊,是的!看起来是对的。让我们将该表达式分配给 grades 变量,并计算我们在本节开头讨论的两个值。
>>> sum_grades = sum(grades)
>>> count_grades = len(grades)
>>> grades_avg = sum_grades / count_grades
>>> print("Average:", grades_avg)
Average: 3.861111111111111
完成了!非常直观,不是吗?第一行对整个列表求和。第二行计算列表的长度,即元素的数量。第三行是基本的除法,用于计算平均值。
将 CSV 文件读入字典列表
正如之前承诺的那样,我们现在了解如何使用标题中的列名来访问数据。为此,我们使用
csv.DictReader()
.
顾名思义,它将每行解析为一个字典,使用标题行来确定列名。如果没有标题行,您可以指定参数
fieldnames
。其余部分基本相同。在官方文档中了解更多详细信息或在
我们的 CSV 课程
.
我们重写一下代码:
>>> import csv
>>>
>>> file = open("data.csv", "r")
>>> data = list(csv.DictReader(file, delimiter=","))
>>> file.close()
>>>
>>> print(data)
[{'id': '1', 'student': 'John', 'grade': '4'}, {'id': '2', 'student': 'Emily', 'grade': '5'}, {'id': '3', 'student': 'Emma', 'grade': '3'}, {'id': '4', 'student': 'Patricia', 'grade': '5'}, {'id': '5', 'student': 'James', 'grade': '2'}, {'id': '6', 'student': 'Michael', 'grade': '4'}, {'id': '7', 'student': 'David', 'grade': '3'}, {'id': '8', 'student': 'Linda', 'grade': '5'}, {'id': '9', 'student': 'Andrew', 'grade': '5'}, {'id': '10', 'student': 'Mary', 'grade': '6'}, {'id': '11', 'student': 'Kevin', 'grade': '6'}, {'id': '12', 'student': 'Barbara', 'grade': '1'}, {'id': '13', 'student': 'George', 'grade': '1'}, {'id': '14', 'student': 'Peter', 'grade': '3'}, {'id': '15', 'student': 'Zach', 'grade': '4'}, {'id': '16', 'student': 'Susan', 'grade': '4'}, {'id': '17', 'student': 'Lisa', 'grade': '4'}, {'id': '18', 'student': 'Tim', 'grade': '4.5'}]
就这么简单!现在,我们可以让提取成绩变得更漂亮:
>>> [float(row["grade"]) for row in data]
[4.0, 5.0, 3.0, 5.0, 2.0, 4.0, 3.0, 5.0, 5.0, 6.0, 6.0, 1.0, 1.0, 3.0, 4.0, 4.0, 4.0, 4.5]
剩余的代码——计算平均值——是相同的。
使用 Python 读取 CSV 文件并使用数据做更多事情!
太棒了!Python 附带了大量模块和函数,使这些任务变得更容易。在本文中,我们回顾了如何在 Python 中解析 CSV 文件。要显示数据表,请阅读 使用纯 Python 或附加模块进行 漂亮打印
通过一步步的实践练习, 了解我们的 Python 数据科学
发表评论 取消回复