Python读取和写入CSV数据有哪几种方式

在日常工作中,需要经常处理csv格式的数据,csv是comma separated value的缩写,这是一种纯文本的格式,没有字体颜色等的限制;我们可以通过csv的库来进行解析成需要的格式数据来使用。

python

假设我们有以下一个staff.csv,我们需要读取里面的数据,文本内容如下:

name,age,height,weight
Felix,30,172,60.0
Duke,28,172,68.2
Wade,27,173,70.3

读取csv数据

一般使用csv库来读取csv数据,如下三种方式可以读取

使用csv.reader()读取为元组或列表序列

import csv

with open('staff.csv') as f:
f_csv = csv.reader(f)
headers = next(f_csv)
print("headers:", headers)
for row in f_csv:
print(row)

结果如下:

headers: ['name', 'age', 'height', 'weight'] ['Felix', '30', '172', '60.0'] ['Duke', '28', '172', '68.2'] ['Wade', '27', '173', '70.3']

csv.reader将文件读取为一个元组序列,将每行数据以列表形式保存,可以按照索引[row][column]位置去取值,如row[0](name)或者row[2](age)去取出对应的值

使用csv.reader()配合namedtuple读取

如果我们需要按照位置去读取数据,但是使用索引切片的形式又感觉容易混淆,那么我们可以配合namedtuple去使用。

使用命名元组,将每一行的数据对应成row,使用点用法row.name/row.age来取代之前的索引,这样会更为清晰,如下:

import csv
from collections import namedtuple

with open('staff.csv') as f:
f_csv = csv.reader(f)
headers = next(f_csv)
Row = namedtuple('Row', headers)
for r in f_csv:
row = Row(*r)
print("name:{} age:{}".format(row.name, row.age))

此种用法也有一定的局限性,如果header的cell存在空格等特殊字符,不能被点语法使用,则会报value Error,所以慎用此功能

例如我们将csv再添加一列nick name,如下:

name,age,height,weight,nick name
Felix,30,172,60.0,Jie
Duke,28,172,68.2,Hao
Wade,27,173,70.3,Ding

再调用之前的代码时,则会报错如下:

123123-1024x180-1

使用csv.DictReader()方法去读取数据

我们还可以将每行的数据以key:value的方式保存在字典中,然后再按照header的key去取值,代码如下:

import csv

with open('staff.csv') as f:
f_csv= csv.DictReader(f)
for row in f_csv:
print(row)

结果如下:

{'name': 'Felix', 'age': '30', 'height': '172', 'weight': '60.0', 'nick name': 'Jie'}
{'name': 'Duke', 'age': '28', 'height': '172', 'weight': '68.2', 'nick name': 'Hao'}
{'name': 'Wade', 'age': '27', 'height': '173', 'weight': '70.3', 'nick name': 'Ding'}

将数据写入csv
使用csv.writer()写入数据

参数为行数据的列表

headers = ['name', 'age', 'height', 'weight'] rows = [['Felix', '30', '172', '60.0'],['Duke', '28', '172', '68.2'],['Wade', '27', '173', '70.3']]

with open('staff.csv' , 'w') as f:
f_csv=csv.writer(f)
f_csv.writerow(headers)
f_csv.writerows(rows)

使用csv.DictWriter()写入数据

从以上我们可以看出,DictWriter()和DictReader()的数据一致,那么方法如下:

import csv

headers = ['name', 'age', 'height', 'weight', 'nick name']

rows= [{'name': 'Felix', 'age': '30', 'height': '172', 'weight': '60.0', 'nick name': 'Jie'},
{'name': 'Duke', 'age': '28', 'height': '172', 'weight': '68.2', 'nick name': 'Hao'},
{'name': 'Wade', 'age': '27', 'height': '173', 'weight': '70.3', 'nick name': 'Ding'}]

with open('staff.csv', 'w') as f:
f_csv = csv.DictWriter(f,headers)
f_csv.writeheader()
f_csv.writerows(rows)

未经允许不得转载:搬瓦工评测网 » Python读取和写入CSV数据有哪几种方式