如何通过Python高效处理CSV文件,可以这样操作

百度已收录   阅读次数: 250
2022-02-0617:26:28 发表评论
摘要

生活工作中使用Python这门编程语言,效率提升不少,本篇文章分享一下在处理Excel表格使用Python进行处理的基本方法,以及一些便捷技巧……

如何通过Python高效处理CSV文件,可以这样操作

开篇寄语

生活工作中使用Python这门编程语言,效率提升不少,本篇文章分享一下在处理Excel表格使用Python进行处理的基本方法,以及一些便捷技巧。

前情提要

内容详情

csv 文件是一个纯文本文档,用于表示和交换表格数据。 csv 文件中的每一行代表一个“实体”,每一列代表它的一个属性。列通常用逗号分隔,但可以使用其他字符代替它作为字段分隔符。在本教程中,我们将看到如何使用 Python 读取和创建 csv 文件,特别是 csv 模块。

正如我们在本教程的介绍中已经提到的,csv 只是一个简单的纯文本文件,其格式可以让我们表示和交换表格数据。 csv 文件中的每一行代表某种实体,除了第一行通常包含字段标题。让我们看一个例子。假设我们想以 csv 格式表示《指环王》书中的人物:

Name,Race
Frodo,hobbit
Aragorn,man
Legolas,elf
Gimli,dwarf

以上是 csv 文件内容的一个简单示例。如您所见,我们使用 ,(逗号)作为字段分隔符。我们将这些数据保存在一个名为 lotr.csv 的文件中。

读取CSV文件内容

要使用 Python 与 csv 文件进行交互,我们要做的第一件事就是导入 csv 模块。让我们编写一个简单的脚本,只需几行代码:

#!/usr/bin/env python3
import csv

if __name__ == '__main__':
    with open('lotr.csv', newline='') as csvfile:
        reader = csv.reader(csvfile)
        for row in reader:
            print(row)

在此示例中,我们假设我们在上面创建的脚本(我们称之为 script.py)与 csv 文件位于同一目录中,并且该目录是我们当前工作的目录。

可以注意到,我们使用 open 函数的换行参数来指定一个空字符串(newline='')作为换行符。这是一种安全措施,因为如 csv 模块文档中所述:

If newline=’‘ is not specified, newlines embedded inside quoted fields will not be interpreted correctly, and on platforms that use \r\n line endings on write an extra \r will be added. It should always be safe to specify newline=’‘, since the csv module does its own (universal) newline handling.

csvfile 对象代表我们打开的文件:我们将它作为参数传递给 csv.reader 函数,该函数返回我们通过 csv_reader 变量引用的阅读器对象。我们使用这个对象来遍历文件的每一行,它以字符串列表的形式返回。在这种情况下,我们只是打印它们。如果我们执行脚本,我们会得到以下结果:

$ ./script.py
['Name', 'Race']
['Frodo', 'hobbit']
['Aragorn', 'man']
['Legolas', 'elf']
['Gimli', 'dwarf']

这很容易,不是吗?如果使用逗号以外的字符作为字段分隔符怎么办?在这种情况下,我们可以使用函数的分隔符参数,并指定应该使用的字符。假设所说的字符是|。我们会写:

csv_reader = csv.reader(csvfile, delimiter="|")

读取字典中的 csv 字段

我们上面使用的可能是我们可以用来用 python 读取 csv 文件的最简单的方法。 csv 模块还定义了 DictReader 类,它让我们将 csv 文件中的每一行映射到字典,其中键是字段名称,值是它们的实际内容。让我们看一个例子。以下是我们修改脚本的方法:

#!/usr/bin/env python3
import csv

if __name__ == '__main__':
    with open('lotr.csv', newline='') as csvfile:
        reader = csv.DictReader(csvfile)
        for row in reader:
            print(row)

DictReader 类构造函数强制的第一个参数是我们打开文件时创建的文件对象。如果我们启动脚本,这次我们会得到以下结果:

{'Name': 'Frodo', ' Race': ' hobbit'}
{'Name': 'Aragorn', ' Race': ' man'}
{'Name': 'Legolas', ' Race': ' elf'}
{'Name': 'Gimli', ' Race': ' dwarf'}

如前所述,第一行中包含的字段用作字典键;但是如果文件的第一行不包含字段名称怎么办?在这种情况下,我们可以使用 DictReader 类构造函数的 fieldnames 参数来指定它们:

reader = csv.DictReader(csvfile, fieldnames=['Name', 'Race])

创建一个 csv 文件

到目前为止,我们只看到了如何从 csv 文件中读取数据,既可以作为每个代表一行的字符串列表,也可以作为字典。

现在让我们看看如何创建 csv 文件。

与往常一样,我们还是从一个例子开始,想象一下,我们想以编程方式创建我们之前手动创建的 csv 文件。

这是我们要编写的代码:

#!/usr/bin/env python3
import csv

if __name__ == '__main__':
    with open('lotr.csv', 'w', newline='') as csvfile:
        writer = csv.writer(csvfile)
        for row in (('Name', 'Race'), ('Frodo', 'hobbit'), ('Aragorn', 'man'), ('Legoals', 'elf'), ('Gimli', 'dwarf')):
            writer.writerow(row)

您应该注意到的第一件事是,这次我们以写入模式 (w) 打开了 lotr.csv 文件。在这种模式下,如果文件不存在则创建文件,否则将被截断(如果您想了解有关此主题的更多信息,请查看我们关于使用 Python 对文件执行输入/输出操作的文章)。

这次我们使用 csv 模块中提供的 writer 函数创建了一个 writer 对象,而不是 reader 对象。该函数接受的参数与读者接受的参数非常相似。例如,我们可以使用具有相同名称的参数指定替代分隔符。

由于在这种情况下我们已经事先知道所有的 csv 行,我们可以避免使用循环,并使用 writer 对象的 writerows 方法一次写入所有行:

#!/usr/bin/env python3
import csv

if __name__ == '__main__':
    with open('lotr.csv', 'w', newline='') as csvfile:
        writer = csv.writer(csvfile)
        writer.writerows((('Name', 'Race'), ('Frodo', 'hobbit'), ('Aragorn', 'man'), ('Legolas', 'elf'), ('Gimli', 'dwarf')))

使用 DictWriter 对象创建一个 csv 文件

csv 模块提供了一个 DictWriter 类,它让我们将字典映射到 csv 行。当我们正在处理的数据以这种方式出现并希望以表格形式表示时,这可能非常有用。让我们看一个例子。

假设我们的 LOTR 字符数据表示为字典列表(可能是从请求模块进行的 API 调用中返回的)。以下是我们可以编写的基于它创建 csv 的内容:

#!/usr/bin/env python3
import csv

characters_data = [
  {
    'Name': 'Frodo',
    'Race': 'hobbit'
  },
  {
    'Name': 'Aragorn',
    'Race': 'man'
  },
  {
    'Name': 'Legolas',
    'Race': 'elf'
  },
  {
    'Name': 'Gimli',
    'Race': 'dwarf'
  }
]

if __name__ == '__main__':
    with open('lotr.csv', 'w') as csvfile:
        writer = csv.DictWriter(csvfile, fieldnames=('Name', 'Race'))
        writer.writeheader()
        writer.writerows(characters_data)

让我们看看我们做了什么。首先,我们创建了 DictWriter 类的实例,将文件对象 (csvfile) 和字段名作为参数传递,字段名必须是用作 csv 字段名的值序列,并确定每个字典中包含的值的顺序应该写入文件。虽然在 DictReader 类构造函数的情况下,此参数是可选的,但在这里它是必需的,并且很容易理解为什么。

创建 writer 对象后,我们调用它的 writeheader 方法:该方法用于创建初始 csv 行,包含我们在构造函数中传递的字段名称。

最后,我们调用 writerows 方法一次写入所有 csv 行,将字典列表作为参数传递(这里我们通过 characters_data 变量引用它们)。

总结

在本文中,我们学习了使用 Python 编程语言读取和创建 csv 文件的基础知识。我们看到了如何使用 DictReader 对象以字符串列表和字典的形式读取 csv 文件的行,以及如何创建一个新的 csv 文件,一次写入一行,或者一次写入所有行。最后,我们看到了如何从 API 调用返回的字典列表开始创建 csv 文件。如果您想了解更多关于 csv python 模块的信息,请查阅官方文档。

分享至:
  • 我的微信
  • 微信扫一扫加好友
  • weinxin
  • 我的微信公众号
  • 扫描关注公众号
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: