Python 数据持久化 - CSV 模块

CSV 代表逗号分隔值。 这种文件格式是在数据库中的电子表格和数据表中导出/导入数据时常用的数据格式。 作为 PEP 305 的结果,csv 模块被并入 Python 的标准库中。它根据 PEP 305 的建议提供了对 CSV 文件执行读/写操作的类和方法。

CSV 是 Microsoft 的 Excel 电子表格软件首选的导出数据格式。 但是,csv 模块也可以处理其他方言表示的数据。

CSV API 接口由以下 writer 写入器和 reader 读取器类组成 −


writer()

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

writer 类有以下方法 −

writerow()

此方法将项目写入可迭代对象(列表、元组或字符串),并用逗号分隔。

writerows()

此方法采用可迭代列表作为参数,并将每个项目作为逗号分隔的项目行写入文件中。

示例

以下示例显示了 writer() 函数的使用。 首先以"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='')
persons=[('Lata',22,45),('Anil',21,56),('John',20,60)]
   obj=csv.writer(csvfile)
   obj.writerows(persons)
   obj.close()

reader()

此函数返回一个 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 文件中的所有行,而不是 for 循环

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

如前所述,csv 模块使用 Excel 作为其默认方言。 csv 模块还定义了一个方言类。 方言是用于实现 CSV 协议的一组标准。 可用的方言列表可以通过 list_dialects() 函数获得。

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

除了可迭代对象之外,csv 模块还可以将字典对象导出到 CSV 文件并读取它以填充 Python 字典对象。 为此,该模块定义了以下类 −

DictWriter()

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

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()

persons.csv 文件显示以下内容 −

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 属性,返回用作文件头的字典键。

print (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'}