Python3 用CSV模块读写CSV文件

前言: CSV简介

CSV (Comma Separated Values)

CSV是英文Comma Separate Values(逗号分隔值)的缩写,顾名思义,文档的内容是由 “ , ” 分隔的一列列的数据构成的。CSV文档是一种编辑方便,可视化效果极佳的数据存储方式。而Python中有着非常强大的库可以处理这种文档,所以,如果你经常用Python处理数据的话,CSV文档当然是一种简单快捷的轻量级选择。下面我将以一个数据处理的例子入手,展现CSV文档的创建和编辑,以及Python是如何对CSV文档读写的。


一、CSV文档的创建和编辑

1. 良好的Excel交互

(1) Excel创建CSV
说到CSV文档,大家可能不熟悉,不过Excel想必没有人不知道,我们经常使用Excel负责数据的存储,编辑以及轻量级的计算。而CSV文档最大的优点就是能和Excel进行方便的交互,我们可以很方便地通过Excel创建、查看以及编辑CSV文档。

在Excel中编辑完数据后,保存文件的时候,会出现一种文件格式,就是 .csv ,如图:

然后现在点击保存,会发现“文件格式”的选项中有“逗号分隔值(.csv)”:

我们选择文件格式为.csv存储,这样,就通过Excel成功创建了一个CSV文档。

(2) 文本访问和编辑CSV
如果现在我们将刚才创建好的CSV文档直接双击点开,他会默认由Excel打开,依旧和上边相同,用Excel可以很方便的编辑,修改数据,这里不再赘述。我要说的是CSV文档也可以以文本的形式展现出来,比如,我现在把刚才保存的CSV文档用Sublime打开,展示如下:

这我们就非常直观地明白为什么叫“逗号分隔值”了,数据之间是由 “,” 分隔开的,且格式非常规范,没有多余的空格,空行等。


二、Python读写CSV文档

1、CSV模块中的函数

1.1 读取CSV文件:

  • reader(csvfile, dialect=’excel’, **fmtparams)

    参数说明:
    csvfile,必须是支持迭代(Iterator)的对象,可以是文件(file)对象或者列表(list)对象,如果是文件对象,打开时需要加”b”标志参数。

dialect,编码风格,默认为excel的风格,也就是用逗号(,)分隔,dialect方式也支持自定义,通过调用register_dialect方法来注册。

>fmtparam,格式化参数,用来覆盖之前dialect对象指定的编码风格。

1
2
3
4
5
6
7
import csv
with open('xxx.csv','r') as myFile:
#读取csv文件,返回的是迭代类型
lines = csv.reader(myFile)
for line in lines:
print(line)

上面程序的效果是将csv文件中的文本按行打印,每一行的元素都是以逗号分隔符’,’分隔得来

例如程序输出结果:
[‘1’, ‘2’]
[‘3’, ‘a’]
[‘4’, ‘b’]


1.2 存为CSV文件:

  • writer(csvfile, dialect=’excel’, **fmtparams)
1
2
3
4
5
6
7
with open('xxx.csv','w') as myFile:    
myWriter=csv.writer(myFile)
myWriter.writerow([7,'g'])
myWriter.writerow([8,'h'])
myList=[[1,2,3],[4,5,6]]
myWriter.writerows(myList)

‘w’表示写模式。

首先open()函数打开当前路径下的名字为’xxx.csv’的文件,如果不存在这个文件,则创建它,返回myFile文件对象。如果文件’xxx.csv’事先存在,调用writer函数会先清空原文件中的文本,再执行writerow/writerows方法。

csv.writer(myFile)返回writer对象myWriter。

writerow()方法是一行一行写入,writerows方法是一次写入多行。

1.3 以字典的形式读出:

  • DictReader()

假设CSV文件的内容如下图所示,DictReader会将第一行的内容(类标题)作为key值,第二行开始才是数据内容。即图中的CSV文件有2列7行数据,第一列的key值为id,第二列的key值为class:

1
2
3
4
5
6
import csv
with open('name.csv','r') as fp:
reader = csv.DictReader(fp)
for line in reader:
#循环打印数据的id和class值,此循环执行7次
print(line['id'],line['class'])

打印结果为:
0 5
1 4
2 13

6 15

1.4 以字典的形式写入:

  • DictWriter()

DictReader可以用来把CSV文件以字典的形式读出,当然还有相对的DictWriter以字典的形式写入内容,比如:

1
2
3
4
5
6
7
8
9
10
11
with open('name.csv','w') as fp:
#写入列标题,即DictWriter构造方法的fieldnames参数,生成writer对象
writer = csv.DictWriter(fp,fieldnames=['id','class'])

#但是如果此时直接写入内容,会导致没有数据名,所以,应先写数据名
#csv提供了专门的函数 writeheader()来实现添加文件头(数据名),简化开发者的工作
writer.writeheader()

#写入数据
for data in datas:
writer.writerow({'id':data[0],'class':data[1]})