从零学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实现挑选出来100以内的质数
Mar 24 Python
利用python程序帮大家清理windows垃圾
Jan 15 Python
Python实现KNN邻近算法
Jan 28 Python
python中的二维列表实例详解
Jun 19 Python
Python3 实现串口两进程同时读写
Jun 12 Python
如何运行带参数的python脚本
Nov 15 Python
python进程的状态、创建及使用方法详解
Dec 06 Python
利用Python自动化操作AutoCAD的实现
Apr 01 Python
python爬虫中PhantomJS加载页面的实例方法
Nov 12 Python
python eventlet绿化和patch原理
Nov 21 Python
python 实现的IP 存活扫描脚本
Dec 10 Python
python实现进度条的多种实现
Apr 29 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
《星际争霸II》全新指挥官斯台特曼现已上线
2020/03/08 星际争霸
解析php中array_merge与array+array的区别
2013/06/21 PHP
destoon安装出现Internal Server Error的解决方法
2014/06/21 PHP
thinkphp微信开发(消息加密解密)
2015/12/02 PHP
用javascript实现分割提取页面所需内容
2007/05/09 Javascript
javascript正则表达式中参数g(全局)的作用
2010/11/11 Javascript
Safari5中alert的无限循环BUG
2011/04/07 Javascript
使图片旋转的3种解决方案
2013/11/21 Javascript
jQuery的animate函数学习记录
2014/08/08 Javascript
Jquery注册事件实现方法
2015/05/18 Javascript
jquery插件jquery.beforeafter.js实现左右拖拽分隔条对比图片的方法
2015/08/07 Javascript
JS基于ocanvas插件实现的简单画板效果代码(附demo源码下载)
2016/04/05 Javascript
原生js实现网易轮播图效果
2020/04/10 Javascript
ReactJs设置css样式的方法
2017/06/08 Javascript
javascript获取指定区间范围随机数的方法
2017/09/08 Javascript
JS继承与闭包及JS实现继承的三种方式
2017/10/15 Javascript
基于JavaScript实现表格滚动分页
2017/11/22 Javascript
Vue插件之滑动验证码用法详解
2020/04/05 Javascript
0基础学习前端开发的一些建议
2020/07/14 Javascript
Vue中computed和watch有哪些区别
2020/12/19 Vue.js
vue实现轮播图帧率播放
2021/01/26 Vue.js
centos6.4下python3.6.1安装教程
2017/07/21 Python
解决pyinstaller打包pyqt5的问题
2019/01/08 Python
Python实战之制作天气查询软件
2019/05/14 Python
Django中celery执行任务结果的保存方法
2019/07/12 Python
python中doctest库实例用法
2020/12/31 Python
Html5新特性用canvas标签画多条直线附效果截图
2014/06/30 HTML / CSS
世界经理人咨询有限公司面试
2014/09/23 面试题
提高EJB性能都有哪些技巧
2012/03/25 面试题
化学教师教学反思
2014/01/17 职场文书
大学生党性分析材料
2014/12/19 职场文书
幼儿教师辞职信范文
2015/03/02 职场文书
生死牛玉儒观后感
2015/06/11 职场文书
新闻稿件写作技巧
2015/07/18 职场文书
Python开发之QT解决无边框界面拖动卡屏问题(附带源码)
2021/05/27 Python
新手初学Java List 接口
2021/07/07 Java/Android