开篇寄语
生活工作中使用Python这门编程语言,效率提升不少,本篇文章分享一下在处理Excel表格使用Python进行处理的基本方法,以及一些便捷技巧。
前情提要
- 《如何用python制作个性动态的二维码,非常酷炫》
- 《Python爬虫爬取股票代码及名称导出为Excel表格以投资分析用》
- 《Python轻松识别验证码使用该库竟然如此简单》
- 《一文以Python连接 MySQL为例操作数据库》
- 《如何使用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 模块文档中所述:
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 模块的信息,请查阅官方文档。
- 我的微信
- 微信扫一扫加好友
- 我的微信公众号
- 扫描关注公众号