Python数据持久性 CSV模块
CSV是逗号分隔值的意思。 这种文件格式是一种常用的数据格式,当从电子表格和数据库中的数据表导出/导入数据时。作为PEP 305的结果,csv模块被纳入Python的标准库中。根据PEP 305的建议,它提供了对CSV文件进行读/写操作的类和方法。
CSV是微软的Excel电子表格软件的首选导出数据格式。然而,csv模块也可以处理由其他方言表示的数据。
CSV API接口由以下写作者和读者类组成
writer()
csv模块中的这个函数返回一个写入器对象,将数据转换为带分隔符的字符串并存储在一个文件对象中。该函数需要一个具有写入权限的文件对象作为参数。在文件中写入的每一行都会发出一个换行符。为了防止行与行之间的额外空间,换行参数被设置为”。
写作者类有以下方法 –
Writerow()
这个方法在一个迭代器(列表、元组或字符串)中写入项目,用逗号字符将它们分开。
writerows()
这个方法接收一个迭代器的列表作为参数,并将每个项目作为逗号分隔的项目行写入文件。
例子
下面的例子显示了write()函数的使用。首先,在 “w “模式下打开一个文件。这个文件被用来获取写入器对象。然后使用 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']
读者对象是一个迭代器。因此,它支持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']
除了 iterables 之外,csv 模块还可以将一个字典对象导出到 CSV 文件中,并读取它来填充 Python 字典对象。For this purpose, this module defines following classes −
DictWriter()
这个函数返回一个 DictWriter 对象。它类似于 writer 对象,但行被映射到 dictionary 对象。该函数需要一个有写入权限的文件对象和一个字典中使用的键的列表作为fieldnames参数。这被用来将文件中的第一行作为头文件写入。
Writeheader()
这个方法把 dictionary 中的 key 列表写成逗号分隔的行,作为文件的第一行。
在下面的例子中,定义了一个字典项的列表。列表中的每个项目都是一个 dictionary。使用 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对象。就像读者对象一样,这个对象也是一个迭代器,用它来检索文件的内容。
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对象转换为普通的字典,我们必须首先从collection模块导入OrderedDict。
from collections import OrderedDict
r=OrderedDict([('name', 'Lata'), ('age', '22'), ('marks', '45')])
dict(r)
{'name': 'Lata', 'age': '22', 'marks': '45'}