向数据文件中增加了一些其他的标识数据之后,使用数据字典将数据与单个的变量相关联
def openFile (fn):
try:
with open(fn, "r") as file:
file_data = file.readline()
return file_data.strip().split(",")
except IOError as error:
print("文件不存在:" + str(error))
return None
def sanitize (time_string):
if "-" in time_string:
splitter = "-"
elif ":" in time_string:
splitter = ":"
else:
return time_string
(mins, second) = time_string.split(splitter)
return (mins + "." + second)
james_data = chapter6.OpenFile.openFile("james2.txt")
# 创建数据字典,将数据与键相关联,用键作为索引访问不同类型的数据
james = {}
james["Name"] = james_data.pop(0)
james["Dob"] = james_data.pop(0)
# print(james["Dob"])
james["Time"] = james_data
# print(james["Time"])
print(james["Name"] + '的最快的三个时间是:' + str(sorted(set(chapter6.sanitize.sanitize(each_data) for each_data in james["Time"]))[0:3]))
# 用数据字典实现julie的最快的三个时间
julie_data = chapter6.OpenFile.openFile("julie2.txt")
# 创建空字典的第二种方法
julie = dict()
julie["Name"] = julie_data.pop(0)
julie["Dob"] = julie_data.pop(0)
julie["Time"] = julie_data
julie_test = sorted(set(chapter6.sanitize.sanitize(each_data) for each_data in julie["Time"]))
print(julie["Name"] + "的最快的三个时间是" + str(julie_test[0:3]))
结果:
将读取数据和创建数据字典封装在一个函数中,让函数返回一个已经填充的字典,把获取前三个时间的代码也封装在函数中
def creatDict (fn):
try:
with open(fn, "r") as file:
file_data = file.readline()
file_clean = file_data.strip().split(",")
return {"Name": file_clean.pop(0), "Dob": file_clean.pop(0), "Time": str(sorted(set(chapter6.sanitize.sanitize(each_data) for each_data in file_clean))[0:3])}
except IOError as error:
print("文件不存在" + str(error))
return None
实现:
sarah = chapter6.CreatDict.creatDict("sarah2.txt")
print(sarah["Name"] + "最快的三个时间是:" + sarah["Time"])
结果:
将代码和数据打包在一个类中,定义一个Athlete 类,实现初始化数据方法和其他的一些增加数据和获取前三的方法
# 定义Athlete类,定义__init__方法和top3方法,方法的第一个参数是self
class Athlete:
def __init__(self, name, dob=None, time=[]):
# 类的每个属性前都要有self,将数据与实例关联
self.name = name
self.dob = dob
self.time = time
def top3(self):
return sorted(set(chapter6.sanitize.sanitize(each_data) for each_data in self.time))[0:3]
def add_time(self, time=None):
return self.time.append(time)
def add_times(self, times=[]):
return self.time.extend(times)
重新调整获取文件内容的函数,返回的结果是一个Athlete对象
# 返回一个Athlete对象
def get_coach_data(fn):
try:
with open(fn, "r")as file:
file_data = file.readline()
file_clean = file_data.strip().split(",")
return Athlete(file_clean.pop(0), file_clean.pop(0), file_clean)
except IOError as error:
print("文件不存在:" + str(error))
return None
实现:
# 定义一个类,定义方法,用get_coach_data方法实现mikey的最快的三个时间
mikey = chapter6.GetData.get_coach_data("mikey2.txt")
print(mikey.name + "最快的三个时间是:" + str(mikey.top3()))
结果:
在类中增加添加时间数据的方法并在测试代码中实现:
# 向mikey增加一个时间和时间列表
mikey.add_time('1.99')
print("更新后mikey最快的三个时间" + str(mikey.top3()))
mikey.add_times(['1.87', '2.21'])
print("再次更新后的mikey的最快的三个时间是:" + str(mikey.top3()))
结果:
继承内置的list,增加需要的属性
# 使用继承类实现Athlete的功能,继承内置的list类
class AthleteList(list):
def __init__(self, name, dob=None, time=[]):
list.__init__([])
self.name = name
self.dob = dob
# 数据本身是时间数据,不需要time属性
self.extend(time)
def top3(self):
return sorted(set(chapter6.sanitize.sanitize(each_data) for each_data in self))[0:3]
实例化一个对象,使用继承类实现
# 实例化一个Marry对象,使用继承类添加数据,并实现排序,返回时间最少的前三个时间
Marry = AthleteList('Marry Vi', '2013-10-29')
print(Marry.name)
print(Marry.dob)
# 继承内置的list,所以使用list的方法可以实现时间值的增加
Marry.append('1.32')
print(Marry.top3())
Marry.extend(['1.35', '1.90'])
print(Marry.top3())
结果: