zl程序教程

您现在的位置是:首页 >  后端

当前栏目

从零学python系列之数据处理编程实例(二)

Python实例编程 系列 数据处理 零学
2023-06-13 09:15:26 时间

在上一节从零学python系列之数据处理编程实例(一)的基础上数据发生了变化,文件中除了学生的成绩外,新增了学生姓名和出生年月的信息,因此将要成变成:分别根据姓名输出每个学生的无重复的前三个最好成绩和出生年月

数据准备:分别建立四个文本文件

             james2.txt    JamesLee,2002-3-14,2-34,3:21,2.34,2.45,3.01,2:01,2:01,3:10,2-22

             julie2.txt       JulieJones,2002-8-17,2.59,2.11,2:11,2:23,3-10,2-23,3:10,3.21,3-21

             mikey2.txt     MikeyMcManus,2002-2-24,2:22,3.01,3:01,3.02,3:02,3.02,3:22,2.49,2:38

             sarah2.txt     SarahSweeney,2002-6-17,2:58,2.58,2:39,2-25,2-55,2:54,2.18,2:55,2:55

 在上一节基础上,修改部分代码,将新要求实现如下:

复制代码代码如下:


importos
print(os.getcwd())
os.chdir("C:\Python33\HeadFirstPython\hfpy_code\chapter6") #将工作空间修改为文件所在的目录

#定义函数get_filedata从文件中取值
defget_filedata(filename):
   try:
       withopen(filename) asf:       #with语句打开和自动关闭文件
           data=f.readline()                #从文件中逐行读取字符
           data_list=data.strip().split(",")  #将字符间的空格清除后,用逗号分隔字符
           return({
                   "name":data_list.pop(0),
                   "date_of_birth":data_list.pop(0),
                   "times":str(sorted(set([modify_time_format(s)forsindata_list]))[0:3])
                   })                               #使用字典将关联的姓名,出生年月,时间键和值进行存储并返回
   exceptIOErrorasioerr:
       print("FileError"+str(ioerr))    #异常处理,打印错误
       return(None)

#定义函数modify_time_format将所有文件中的时分表达方式统一为“分.秒”
defmodify_time_format(time_string):
   if"-"intime_string:
       splitter="-"
   elif":"intime_string:
       splitter=":"
   else:
       splitter="."
   (mins,secs)=time_string.split(splitter)#用分隔符splitter分隔字符后分别存入mins和secs
   return(mins+"."+secs)

#定义函数get_prev_three返回文件中排名前三的不重复的时间成绩
defget_prev_three(filename):
   new_list=[modify_time_format(each_t)foreach_tinget_filedata(filename)]  #采用列表推导将统一时分表达方式后的记录生成新的列表
   delete_repetition=set(new_list)                                                                    #采用集合set函数删除新列表中重复项,并生成新的集合
   in_order=sorted(delete_repetition)                                                              #采用复制排序sorted函数对无重复性的新集合进行排序
   return(in_order[0:3])     

#输出james的排名前三的不重复成绩和出生年月
james=get_filedata("james2.txt")
print(james["name"]+""sfastesttimesare:"+james["times"])
print(james["name"]+""sbirthdayis:" +james["date_of_birth"])

#输出julie的排名前三的不重复成绩和出生年月
julie=get_filedata("julie2.txt")
print(julie["name"]+""sfastesttimesare:"+julie["times"])
print(julie["name"]+""sbirthdayis:" +julie["date_of_birth"])

#输出mikey的排名前三的不重复成绩和出生年月
mikey=get_filedata("mikey2.txt")
print(mikey["name"]+""sfastesttimesare:"+mikey["times"])
print(mikey["name"]+""sbirthdayis:" +mikey["date_of_birth"])

#输出sarah的排名前三的不重复成绩和出生年月
sarah=get_filedata("sarah2.txt")
print(sarah["name"]+""sfastesttimesare:"+sarah["times"])
print(sarah["name"]+""sbirthdayis:" +sarah["date_of_birth"])

通过建立继承内置list的类AthleteList,将方法定义在类中实现相同功能:

复制代码代码如下:


importos
print(os.getcwd())
os.chdir("C:\Python33\HeadFirstPython\hfpy_code\chapter6") #将工作空间修改为文件所在的目录

#定义类AthleteList继承python内置的list
classAthleteList(list):
   def__init__(self,name,dob=None,times=[]):
       list.__init__([])
       self.name=name
       self.dob=dob
       self.extend(times)
   defget_prev_three(self):
       return(sorted(set([modify_time_format(t)fortinself]))[0:3])

defget_filedata(filename):
   try:
       withopen(filename) asf:       #with语句打开和自动关闭文件
           data=f.readline()                #从文件中逐行读取字符
           data_list=data.strip().split(",")  #将字符间的空格清除后,用逗号分隔字符
           return(
                  AthleteList(data_list.pop(0),data_list.pop(0),data_list)
                  )                               #使用字典将关联的姓名,出生年月,时间键和值进行存储并返回
   exceptIOErrorasioerr:
       print("FileError"+str(ioerr))    #异常处理,打印错误
       return(None)

defmodify_time_format(time_string):
   if"-"intime_string:
       splitter="-"
   elif":"intime_string:
       splitter=":"
   else:
       splitter="."
   (mins,secs)=time_string.split(splitter)#用分隔符splitter分隔字符后分别存入mins和secs
   return(mins+"."+secs)

james=get_filedata("james2.txt")
print(james.name+""sfastesttimesare:"+str(james.get_prev_three()))

julie=get_filedata("julie2.txt")
print(julie.name+""sfastesttimesare:"+str(julie.get_prev_three()))

mikey=get_filedata("mikey2.txt")
print(mikey.name+""sfastesttimesare:"+str(mikey.get_prev_three()))

sarah=get_filedata("sarah2.txt")
print(sarah.name+""sfastesttimesare:"+str(sarah.get_prev_three()))