《Python 3.x入门到应用实践》 —3.8.2 读取CSV文件
3.8.2 读取CSV文件
CSV文件是常见的开放数据(Open Data)格式。所谓开放数据,是指可以被自由使用和散布的数据,虽然有些开放数据要求用户标示数据源与所有人,但大部分政府数据的开放平台可以免费获取数据,这些开放数据会以常见的开放格式在网络上公开。不同的应用程序如果想要交换数据,必须借助通用的数据格式,CSV格式就是其中的一种,全名为Comma-Separated Values,字段之间以逗号“,”分隔,与TXT文件一样都是纯文本文件,可以用记事本等文本编辑器来编辑。
CSV格式常用在电子表格以及数据库,比如Excel文件可以将数据导出成CSV格式,也可以导入CSV文件进行编辑。网络上许多开放数据(Open Data)通常也会给用户提供直接下载的CSV格式数据,当大家学会了CSV文件的处理之后,就可以将这些数据用于更多的分析和应用了。
本范例程序使用的scores.csv文件内容如图3-17所示。
图3-17
Python内建csv模块(module),能够非常轻松地处理CSV文件。csv模块是标准库模块,使用前必须先用import指令导入。下面来看csv模块的用法。
csv模块的用法
csv模块既可以读取CSV文件,也可以写入CSV文件,读取之前必须先打开CSV文件,再使用csv.reader方法读取CSV文件里的内容,代码如下:
import csv #载入csv.py
with open("scores.csv", encoding="utf-8") as csvfile: #打开文件指定为csvfile
reader = csv.reader(csvfile) #返回reader对象
for row in reader: #for循环逐行读取数据
print(row)
上面程序的执行结果如图3-18所示。
图3-18
如果CSV文件与.py文件放在不同的文件夹中,就必须加上文件的完整路径。
open()指令会将CSV文件开启并返回文件对象,范例程序中将文件对象赋值给csvfile变量,默认文件使用unicode编码,如果文件使用不同的编码,就必须使用encoding参数设置编码。本范例程序所使用的CSV文件是无BOM的utf-8格式,所以encoding="utf-8"。
csv.reader()函数会读取CSV文件,转成reader对象再返回给调用者,reader对象是可以迭代(iterator)处理的字符串(string)列表(List)对象。上面的程序中使用reader变量来接收reader对象,再通过for循环逐行读取数据:
reader = csv.reader(csvfile) #返回reader对象
for row in reader: #for循环逐行读取数据放入row变量中
列表对象是Python的容器数据类型(Container Type),它是一串由逗号分隔的值,用中括号“[]”括起来:
['方小花', '87', '100', '98']
上面的列表对象共有4个元素,使用中括号“[]”搭配元素的下标(index,或称为索引)就能存取每一个元素,下标从0开始,从左到右分别是row[0]、row[1]……。例如要获取第4个元素的值,可以如下表示:
name = row[3]
使用with语句打开文件
在读取或写入文件之前,必须先使用open()函数将文件打开;当读取或写入完成时,必须使用close()函数将文件关闭,以确保数据已被正确读出或写入文件。如果在调用close()方法之前发生异常,那么close()方法将不会被调用,举例来说:
f = open("scores.csv") #打开文件
csvfile = f.read() #读取文件内容
1 / 0 #error
f.close() #关闭文件
第3行程序语句犯了分母为0的错误,执行到此,程序就会停止执行,所以close()不会被调用,这样可能会有文件损坏或数据遗失的风险。
有两特种方法可以避免这样的问题:一种方法是加上try…except语句捕获错误,另一种方法是使用with语句。Python的with语句配有特殊的方法,文件被打开之后,如果程序发生异常,就会自动调用close()方法,如此一来,就能确保已打开的文件被正确、安全地关闭。
- 点赞
- 收藏
- 关注作者
评论(0)