使用 Python 读取和写入 CSV 文件


CSV(代表逗号分隔值)格式是一种常用的数据格式,电子表格使用它。Python 标准库中的 csv 模块提供了用于对 CSV 文件执行读/写操作的类和方法。

writer()

此函数在 csv 模块中返回一个 writer 对象,该对象将数据转换为分隔字符串并存储在文件对象中。该函数需要一个具有写入权限的文件对象作为参数。写入文件中的每一行都会输出一个换行符。为了防止行之间出现额外的空格,newline 参数设置为 ‘’。

writer 类具有以下方法

writerow()

此函数写入可迭代对象(列表、元组或字符串)中的项目,并用逗号字符分隔它们。

writerows()

此函数以列表的可迭代对象作为参数,并将每个项目写入文件中的逗号分隔的行。

以下示例显示了 write() 函数的使用。首先,一个文件以 'w' 模式打开。此文件用于获取 writer 对象。然后,使用 writerow() 方法将元组列表中的每个元组写入文件。

>>> import csv
>>> persons=[('Lata',22,45),('Anil',21,56),('John',20,60)]
>>> csvfile=open('persons.csv','w', newline='')
>>> obj=csv.writer(csvfile)
>>> for person in persons:
obj.writerow(person)
>>> csvfile.close()

这将在当前目录中创建 'persons.csv' 文件。它将显示以下数据。

Lata,22,45
Anil,21,56
John,20,60

而不是遍历列表以单独写入每一行,我们可以使用 writerows() 方法。

>>> csvfile = open('persons.csv','w', newline='')
>>> obj = csv.writer(csvfile)
>>> obj.writerows(persons)
>>> obj.close()

read()

此函数返回一个 reader 对象,该对象返回 csv 文件中行的迭代器。使用常规的 for 循环,以下示例中显示了文件中的所有行。

>>> csvfile=open('persons.csv','r', newline='')
>>> obj=csv.reader(csvfile)
>>> for row in obj:
print (row)
['Lata', '22', '45']
['Anil', '21', '56']
['John', '20', '60']

由于 reader 对象是一个迭代器,因此内置的 next() 函数也可用于显示 csv 文件中的所有行。

>>> csvfile = open('persons.csv','r', newline='')
>>> obj = csv.reader(csvfile)
>>> while True:
try:
row=next(obj)
print (row)
except StopIteration:
break

csv 模块还定义了一个 dialect 类。Dialect 是用于实现 CSV 协议的一组标准。可以通过 list_dialects() 函数获取可用的方言列表。

>>> csv.list_dialects()
['excel', 'excel-tab', 'unix']

DictWriter()

此函数返回一个 DictWriter 对象。它类似于 writer 对象,但行映射到字典对象。该函数需要一个具有写入权限的文件对象,以及字典中用作 fieldnames 参数的键列表。这用于在文件的第一行写入标题。

writeheader()

此方法将字典中的键列表作为逗号分隔的行写入文件的第一行。

在以下示例中,定义了一个字典项列表。列表中的每个项目都是一个字典。使用 writrows() 方法,它们以逗号分隔的方式写入文件。

>>> persons=[{'name':'Lata', 'age':22, 'marks':45}, {'name':'Anil', 'age':21, 'marks':56}, {'name':'John', 'age':20, 'marks':60}]
>>> csvfile=open('persons.csv','w', newline='')
>>> fields=list(persons[0].keys())
>>> obj=csv.DictWriter(csvfile, fieldnames=fields)
>>> obj.writeheader()
>>> obj.writerows(persons)
>>> csvfile.close()

该文件显示以下内容。

name,age,marks
Lata,22,45
Anil,21,56
John,20,60

DictReader()

此函数从底层 CSV 文件返回一个 DictReader 对象。与 reader 对象一样,它也是一个迭代器,可以使用它来检索文件的内容。

>>> csvfile = open('persons.csv','r', newline='')
>>> obj = csv.DictReader(csvfile)

该类提供 fieldnames 属性,返回用作文件标题的字典键。

>>> obj.fieldnames
['name', 'age', 'marks']

使用循环遍历 DictReader 对象以获取各个字典对象。

>>> for row in obj:
print (row)

这将产生以下输出。

OrderedDict([('name', 'Lata'), ('age', '22'), ('marks', '45')])
OrderedDict([('name', 'Anil'), ('age', '21'), ('marks', '56')])
OrderedDict([('name', 'John'), ('age', '20'), ('marks', '60')])

要将 OrderedDict 对象转换为普通字典,我们必须首先从 collections 模块导入 OrderedDict。

>>> from collections import OrderedDict
>>> r=OrderedDict([('name', 'Lata'), ('age', '22'), ('marks', '45')])
>>> dict(r)
{'name': 'Lata', 'age': '22', 'marks': '45'}

本文介绍了 csv 模块的功能。

更新于:2020年6月25日

2K+ 次查看

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告