Python读写CSV数据的几种方式

本文详细介绍了Python中使用csv模块处理CSV数据的方法,包括使用csv.reader、csv.DictReader和csv.writer、csv.DictWriter进行读写操作。通过实例展示了如何以元组、字典形式读取和写入数据,以及利用namedtuple提升代码可读性。
摘要由CSDN通过智能技术生成

读写csv数据的几种方式

在日常工作中,需要经常处理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库来读取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

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

使用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)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值