在上一節從零學python系列之資料處理編程執行個體(一)的基礎上資料發生了變化,檔案中除了學生的成績外,新增了學生姓名和出生年月的資訊,因此將要成變成:分別根據姓名輸出每個學生的無重複的前三個最好成績和出生年月
資料準備:分別建立四個文字檔
james2.txt James Lee,2002-3-14,2-34,3:21,2.34,2.45,3.01,2:01,2:01,3:10,2-22
julie2.txt Julie Jones,2002-8-17,2.59,2.11,2:11,2:23,3-10,2-23,3:10,3.21,3-21
mikey2.txt Mikey McManus,2002-2-24,2:22,3.01,3:01,3.02,3:02,3.02,3:22,2.49,2:38
sarah2.txt Sarah Sweeney,2002-6-17,2:58,2.58,2:39,2-25,2-55,2:54,2.18,2:55,2:55
在上一節基礎上,修改部分代碼,將新要求實現如下:
複製代碼 代碼如下:
import os
print(os.getcwd())
os.chdir('C:\Python33\HeadFirstPython\hfpy_code\chapter6') #將工作空間修改為檔案所在的目錄
#定義函數get_filedata從檔案中取值
def get_filedata(filename):
try:
with open(filename) as f: #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) for s in data_list]))[0:3])
}) #使用字典將關聯的姓名,出生年月,時間鍵和值進行儲存並返回
except IOError as ioerr:
print ('File Error' + str(ioerr)) #異常處理,列印錯誤
return (None)
#定義函數modify_time_format將所有檔案中的時分表達方式統一為“分.秒”
def modify_time_format(time_string):
if "-" in time_string:
splitter="-"
elif ":" in time_string:
splitter=":"
else:
splitter="."
(mins, secs)=time_string.split(splitter) #用分隔字元splitter分隔字元後分別存入mins和secs
return (mins+ '.' +secs)
#定義函數get_prev_three返迴文件中排名前三的不重複的時間成績
def get_prev_three(filename):
new_list=[modify_time_format(each_t) for each_t in get_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"]+"'s fastest times are: " + james["times"])
print (james["name"] + "'s birthday is: " + james["date_of_birth"])
#輸出julie的排名前三的不重複成績和出生年月
julie = get_filedata('julie2.txt')
print (julie["name"]+"'s fastest times are: " + julie["times"])
print (julie["name"] + "'s birthday is: " + julie["date_of_birth"])
#輸出mikey的排名前三的不重複成績和出生年月
mikey = get_filedata('mikey2.txt')
print (mikey["name"]+"'s fastest times are: " + mikey["times"])
print (mikey["name"] + "'s birthday is: " + mikey["date_of_birth"])
#輸出sarah的排名前三的不重複成績和出生年月
sarah = get_filedata('sarah2.txt')
print (sarah["name"]+"'s fastest times are: " + sarah["times"])
print (sarah["name"] + "'s birthday is: " + sarah["date_of_birth"])
通過建立繼承內建list的類AthleteList,將方法定義在類中實現相同功能:
複製代碼 代碼如下:
import os
print(os.getcwd())
os.chdir('C:\Python33\HeadFirstPython\hfpy_code\chapter6') #將工作空間修改為檔案所在的目錄
#定義類AthleteList繼承python內建的list
class AthleteList(list):
def __init__(self, name, dob=None, times=[]):
list.__init__([])
self.name=name
self.dob=dob
self.extend(times)
def get_prev_three(self):
return (sorted(set([modify_time_format(t) for t in self]))[0:3])
def get_filedata(filename):
try:
with open(filename) as f: #with語句開啟和自動關閉檔案
data=f.readline() #從檔案中逐行讀取字元
data_list=data.strip().split(',') #將字元間的空格清除後,用逗號分隔字元
return(
AthleteList(data_list.pop(0), data_list.pop(0), data_list)
) #使用字典將關聯的姓名,出生年月,時間鍵和值進行儲存並返回
except IOError as ioerr:
print ('File Error' + str(ioerr)) #異常處理,列印錯誤
return (None)
def modify_time_format(time_string):
if "-" in time_string:
splitter="-"
elif ":" in time_string:
splitter=":"
else:
splitter="."
(mins, secs)=time_string.split(splitter) #用分隔字元splitter分隔字元後分別存入mins和secs
return (mins+ '.' +secs)
james = get_filedata('james2.txt')
print (james.name+"'s fastest times are: " + str(james.get_prev_three()))
julie = get_filedata('julie2.txt')
print (julie.name+"'s fastest times are: " + str(julie.get_prev_three()))
mikey = get_filedata('mikey2.txt')
print (mikey.name+"'s fastest times are: " + str(mikey.get_prev_three()))
sarah = get_filedata('sarah2.txt')
print (sarah.name+"'s fastest times are: " + str(sarah.get_prev_three()))