赞
踩
在日常工作中,需要经常处理csv格式的数据,csv是comma separated value的缩写,这是一种纯文本的格式,没有字体颜色等的限制;我们可以通过csv的库来进行解析成需要的格式数据来使用
假设我们有以下一个staff.csv
,我们需要读取里面的数据,文本内容如下:
name,age,height,weight
Felix,30,172,60.0
Duke,28,172,68.2
Wade,27,173,70.3
一般使用csv库来读取csv数据,如下三种方式可以读取
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)去取出对应的值
如果我们需要按照位置去读取数据,但是使用索引切片的形式又感觉容易混淆,那么我们可以配合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
再调用之前的代码时,则会报错如下:
我们还可以将每行的数据以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'}
参数为行数据的列表
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)
从以上我们可以看出,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)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。