当前位置:   article > 正文

Python读写CSV数据的几种方式_python csv row column

python csv row column

读写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
  • 1
  • 2
  • 3
  • 4

读取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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

结果如下:

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

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))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

此种用法也有一定的局限性,如果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
  • 1
  • 2
  • 3
  • 4

再调用之前的代码时,则会报错如下:
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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

结果如下:

{'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'}
  • 1
  • 2
  • 3

将数据写入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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

使用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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/212622?site
推荐阅读
相关标签
  

闽ICP备14008679号