Python 修改CSV文件

2,022 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第27天,点击查看活动详情

前言

由于 CSV 文件仅仅是简单的文本文件,因此更新 CSV 文件中内容的最佳方式是首先读取文件中的数据,并将它们处理为 Python 内部对象,进行更改,然后以相同的格式覆盖原始数据。

Python 修改CSV文件

在本节中,我们将学习如何使用 Python 修改 CSV 文件中的数据。

假设在CSV文件中有以下数据,其中用户 '1' 对电影 'Star Wars' 的评分有误,其实际评分为 7.9,因此需要修改此文件。

User nameMovie namerating
1Star Wars7.8
2Back to Future8
2Batman7.7
3Spy 0078.3

首先,导入 csv 模块并定义文件名:

>>> import csv
>>> file_name = 'movies_rating.csv'

导入 csv 模块后,我们从指定 csv 文件中提取所有数据。为了便于操作,我们在 with 块中打开该文件,在文件使用完毕后可以自动关闭文件句柄。使用 DictReader 可以非常方便地将数据转换为字典列表,其中标头作为键,单元格中的内容作为值,例如第一行的数据被转换为 {'User name': 1, 'Movie name': 'Star Wars', 'rating':7.8}。然后,我们可以操作和修改格式化后的数据。

使用 DictReader 读取文件的内容并将此内容转换为数据行的列表:

>>> with open(file_name, newline='') as f:
...     data = [row for row in csv.DictReader(f)]
...

检查获得的数据,将文件中第一个评分记录中的评分数据从 7.8 修改为 7.9,解决数据错误问题:

>>> data
[OrderedDict([('User name', '001'), ('Movie name', 'Star Wars'), ('rating', '7.8')]), OrderedDict([('User name', '002'), ('Movie name', 'Back to Future'), ('rating', '8.0')]), OrderedDict([('User name', '002'), ('Movie name', 'Batman'), ('rating', '7.7')]), OrderedDict([('User name', '003'), ('Movie name', 'Spy 007'), ('rating', '8.3')])]
>>> data[0]['rating']
'7.8'
>>> data[0]['rating'] = 7.9

在本节中,我们通过直接访问行号来修改数据,但在通常情况下,我们可能需要首先搜索特定信息,确定相应行后再进行修改。

再次打开文件并存储修改后的数据记录:

>>> header = data[0].keys()
>>> with open(file_name, 'w', newline='') as f:
...     writer = csv.DictWriter(f, fieldnames=header)
...     writer.writeheader()
...     writer.writerows(data)
...

数据修改后,我们直接覆盖原文件并使用 DictWriter 存储数据。DictWriter 需要通过声明字段名 (fieldnames=header) 来定义列上的字段,为了获得这些字段名,我们可以先读取其中一行数据字典的键并将它们存储在 header 中。

原文件以 w 模式再次打开以覆盖它。DictWriter 首先使用 writeheader 存储标头,然后通过调用 writerows() 一次存储所有行。我们也可以通过调用 writerow() 方法每次写入一行数据。

在电子表格软件中检查结果。在下图中可以看到,该文件使用 WPS 软件打开显示,可以看到第一行的评分数据已经被修改:

修改结果