Python使用csv模块从文件加载数据并绘制图表
本文详解Python中利用内置csv模块读取CSV文件数据的方法,涵盖文件打开、逐行解析及索引提取技巧。结合Matplotlib库,演示如何将提取的数值数据转换为柱状图与折线图,实现从文件加载到可视化的完整流程。
从文件加载数据的方法
此前的教程多采用手动录入或随机函数生成数据。现实中存在多种类型的文件,掌握从文件中提取数据并进行图形化展示的方法至关重要。
例如在之前的Python基础(12)中介绍了打开文件的方式,可以直接读取文件内容,这极大地拓展了数据来源。接下来将展示几种具体的实现方法。
使用CSV模块加载数据
我们将使用Python内置的csv模块来加载CSV格式的文件。
CSV文件是一种特殊的文本文件,其数据以逗号作为分隔符,非常适合进行数据解析。首先使用Excel建立如下表格和数据,另存为csv格式文件,并将其放置在代码目录下。

Python标准库中自带CSV模块,只需import导入即可使用。例如,若需要将上述CSV文件的所有内容打印出来,代码如下:
import csv #import csv 用来导入csv模块
filename = 'E:\WorkSpace\python\coding\score.csv' #文件保存的绝对路径
with open(filename) as file_csv: #是不是忘记了如何打开文件?打开文件,并将结果文件对象存储在file_csv中
reader = csv.reader(file_csv) #直接调读取 用csv.read()读取文件内容
for row in reader: # 用for循环打印每一行
print(row)运行结果如下:
['Name', 'Grade', 'Class', 'Age', 'mathscore', 'Englishscore'] ['Lucy', '7', '2', '14', '95', '86'] ['bush', '8', '1', '15', '80', '75'] ['lily', '7', '3', '14', '93', '95'] ['Jack', '8', '2', '14', '87', '84'] ['Mary', '9', '1', '15', '85', '86'] ['philip', '7', '3', '14', '90', '92'] ['Liming', '9', '2', '16', '99', '87']
解析文件头与索引提取
打印文件头及其位置
读取文件的目的是获取其中的数据,需要对相关信息进行分离。首先看看如何读取表头,即文件的第一行,next()函数用于返回文件中的下一行。
import csv #import csv 用来导入csv模块
filename = 'E:\WorkSpace\python\coding\score.csv' #文件保存的绝对路径
with open(filename) as file_csv: #是不是忘记了如何打开文件?打开文件,并将结果文件对象存储在file_csv中
reader = csv.reader(file_csv) #直接调读取 用csv.read()读取文件内容
header_row = next(reader) #模块csv包含函数 next() ,调用它并将阅读器对象传递给它时,它将返回文件中的下一行。
#调用了next()一次,因此得到的是文件的第一行,其中包含文件头
#for row in reader: # 用for循环打印每一行 # print(row)
for index, column_header in enumerate(header_row): #对列表调用了enumerate()来获取每个元素的索引及其值
print(index, column_header)运行后的结果如下所示:
0 Name 1 Grade 2 Class 3 Age 4 mathscore 5 Englishscore
提取其中的索引,即name的索引为0,Grade的索引为1。知道了索引便可以读取其中的任何数据,例如我们要打印出mathscore,其索引为4,于是代码如下:
scores =[] 定义一个空的list
for row in reader:
scores.append(int(row[4])) #读取的文件,默认为字符串,用int()转换为数字。
print(scores)运行结果:
[95, 80, 93, 87, 85, 90, 99]
基于CSV数据的柱状图绘制
接下来,制作图表展示一下,先把mathscore和englishscore分数做个柱状对比。代码如下:
import matplotlib.pyplot as plt
import csv #import csv 用来导入csv模块
filename = 'E:\WorkSpace\python\coding\score.csv' #文件保存的绝对路径
with open(filename) as file_csv: #是不是忘记了如何打开文件?打开文件,并将结果文件对象存储在file_csv中
reader = csv.reader(file_csv) #直接调读取 用csv.read()读取文件内容
header_row = next(reader) #模块csv包含函数 next() ,调用它并将阅读器对象传递给它时,它将返回文件中的下一行。
#调用了 next() 一次,因此得到的是文件的第一行,其中包含文件头
mathscores =[] #定义两个列表
englishscores=[]
for row in reader:
mathscores.append(int(row[4])) #读取索引为4的数据,默认为字符串,用int()转换为数字。
englishscores.append(int(row[5])) #读取索引为5的数据,用int()转换为数字。
plt.bar([1,3,5,7,9,11,13],mathscores,label='math',color='#FF2204')
plt.bar([2,4,6,8,10,12,14],englishscores, label='englis', color='g')
plt.legend()
plt.title('scores')
plt.show()已将那些打印相关代码删除。看运行结果:

基于时间数据的折线图与面积图绘制
接下来,我们读取文件,并根据文件中的时间来绘制图表。
新建一个年份的数据(数据为虚构),第一列是年份,第二列是每年毕业的人数,第三列是每年申请人数,如图所示:

要求:
1,按年份分别显示出每年两者的人数,并用不同的颜色表示;
2、两者间也用其他颜色进行填充。
完成代码如下:
import matplotlib.pyplot as plt
import csv #import csv 用来导入csv模块
from datetime import datetime #引入时间相关模块
filename = 'E:\WorkSpace\python\coding\graduatesNumbers.csv' #文件保存的绝对路径
with open(filename) as file_csv: #是不是忘记了如何打开文件?打开文件,并将结果文件对象存储在file_csv中
reader = csv.reader(file_csv) #直接调读取 用csv.read()读取文件内容
header_row = next(reader)
dates=[]
numbers=[]
application_numbers=[]
for row in reader:
current_date = datetime.strptime(row[0], "%Y/%m/%d") #年份,strptime()日期格式转化为字符串格式的函数
dates.append(current_date)
numbers.append(int(row[1])) #读取索引为1的数据,默认为字符串,用int()转换为数字,即Numbers of graduates 。
application_numbers.append(int(row[2])) #读取索引为2的数据,即Number of applicants
plt.plot(dates,numbers,label='Numbers of graduate', c='red') #显示第一条线
plt.plot(dates,application_numbers,label='Number of applicant', c='green') #显示第二条线application_numbers折线
plt.fill_between(dates,numbers, application_numbers, facecolor='blue', alpha=0.5) #在两线之间填充颜色 alpha透明度
plt.title("The numbers of graduate",fontsize=24)
plt.xlabel('Years', fontsize=16)
plt.ylabel("The numbers", fontsize=16)
plt.legend()
plt.show()实际运行结果如下:

以上就是Python实现从文件中加载数据的方法详解的详细内容,更多关于Python 加载数据的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













