从零学python系列之数据处理编程实例(二)
admin
2023-07-31 02:08:02
0

在上一节从零学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()))

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
项目管理和工程管理的区别 项目管理 项目管理,顾名思义就是专注于开发和完成项目的管理,以实现目标并满足成功标准和项目要求。 工...