從零學python系列之資料處理編程執行個體(二)_python

來源:互聯網
上載者:User

在上一節從零學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()))

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.