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


Posted in Python onMay 22, 2014

在上一节从零学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()))
Python 相关文章推荐
python pdb调试方法分享
Jan 21 Python
Python图算法实例分析
Aug 13 Python
Pandas:DataFrame对象的基础操作方法
Jun 07 Python
python3实现windows下同名进程监控
Jun 21 Python
Numpy中的mask的使用
Jul 21 Python
Python安装pycurl失败的解决方法
Oct 15 Python
Scrapy框架爬取西刺代理网免费高匿代理的实现代码
Feb 22 Python
Python调用C语言的实现
Jul 26 Python
PyCharm使用Docker镜像搭建Python开发环境
Dec 26 Python
Django之全局使用request.user.username的实例详解
May 14 Python
用Python 爬取猫眼电影数据分析《无名之辈》
Jul 24 Python
Python使用tkinter实现小时钟效果
Feb 22 Python
从零学python系列之数据处理编程实例(一)
May 22 #Python
Python学习笔记_数据排序方法
May 22 #Python
从零学Python之hello world
May 21 #Python
Python开发实例分享bt种子爬虫程序和种子解析
May 21 #Python
从零学Python之引用和类属性的初步理解
May 15 #Python
python中xrange和range的区别
May 13 #Python
Python中os和shutil模块实用方法集锦
May 13 #Python
You might like
介绍几个array库的新函数 php
2006/12/29 PHP
PHP简单实现“相关文章推荐”功能的方法
2014/07/19 PHP
php中addslashes函数与sql防注入
2014/11/17 PHP
php静态文件返回304技巧分享
2015/01/06 PHP
PHP判断是否微信访问的方法示例
2019/03/27 PHP
在b/s开发中经常用到的javaScript技术
2006/08/23 Javascript
asp.net+jquery滚动滚动条加载数据的下拉控件
2010/06/25 Javascript
关于query Javascript CSS Selector engine
2013/04/12 Javascript
使用jquery的ajax需要注意的地方dataType的设置
2013/08/12 Javascript
js定时器的使用(实例讲解)
2014/01/06 Javascript
sogou地图API用法实例教程
2014/09/11 Javascript
浅谈javascript中call()、apply()、bind()的用法
2015/04/20 Javascript
Ajax中解析Json的两种方法对比分析
2015/06/25 Javascript
javascript获取本机操作系统类型的方法
2015/08/13 Javascript
分离与继承的思想实现图片上传后的预览功能:ImageUploadView
2016/04/07 Javascript
jQuery实现的无缝广告图片左右滚动功能详解
2016/12/24 Javascript
Vue-不允许嵌套式的渲染方法
2018/09/13 Javascript
d3绘制基本的柱形图的实现代码
2018/12/12 Javascript
详解微信小程序获取当前时间及日期的方法
2019/04/28 Javascript
Vue+Express实现登录状态权限验证的示例代码
2019/05/05 Javascript
vue项目中监听手机物理返回键的实现
2020/01/18 Javascript
vuex管理状态仓库使用详解
2020/07/29 Javascript
python使用reportlab画图示例(含中文汉字)
2013/12/03 Python
以911新闻为例演示Python实现数据可视化的教程
2015/04/23 Python
Python Unittest自动化单元测试框架详解
2018/04/04 Python
Django对models里的objects的使用详解
2019/08/17 Python
序列化Python对象的方法
2020/08/01 Python
html2canvas生成的图片偏移不完整的解决方法
2020/05/19 HTML / CSS
全天然狗零食:Best Bully Sticks
2016/09/22 全球购物
JD Sports马来西亚:英国领先的运动鞋和运动服饰零售商
2018/03/13 全球购物
澳大利亚在线家具店:Luxo Living
2019/03/24 全球购物
Theflamel意大利:女士奢华服装、鞋子和配件
2020/01/11 全球购物
自荐书范文范例
2014/02/13 职场文书
模具毕业生推荐信
2014/02/15 职场文书
小学运动会加油词
2015/07/18 职场文书
六五普法心得体会2016
2016/01/21 职场文书