📜  Python数据持久性-CSV模块

📅  最后修改于: 2020-11-07 08:24:49             🧑  作者: Mango


CSV代表逗号分隔的值。在与数据库中的电子表格和数据表之间进行数据导入/导出时,此文件格式是一种常用的数据格式。由于PEP 305,csv模块已合并到Python的标准库中。根据PEP 305的建议,它介绍了用于对CSV文件执行读/写操作的类和方法。

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

CSV API接口由以下作家和读者类组成-

作家()

csv模块中的此函数返回writer对象,该对象将数据转换为定界字符串并存储在文件对象中。该函数需要具有写许可权作为参数的文件对象。写在文件中的每一行都发出一个字符。为防止行之间有多余的空格,将newline参数设置为”。

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对象,该对象返回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对象相似,但行被映射到字典对象。该函数需要一个具有写权限的文件对象,以及在字典中用作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()

person.csv文件显示以下内容-

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

DictReader()

此函数从基础CSV文件返回DictReader对象。就读者对象而言,它也是一个迭代器,使用它可以检索文件的内容。

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