Head First Python-Python简单处理文件

前面介绍了自定义格式化输出列表函数printList(),下面再介绍下格式化列表项列表项的排序

 这里有一组列表数据,记录运动员跑步时间的,要求按照时间大小进行排序。这里每项数据记录的时间格式不一样,无法统一排序。(对字符串排序时,短横线-排在点号前面,点号.在冒号:前面。)

 直接排序:

复制代码
def get_coach_data(filename):
    try:
        with open(filename) as fn:
            data=fn.readline()
            temp_data=data.strip().split(',') #方法串链
        return (sorted(temp_data))
    except IOError as ioe:
        print('File Error: '+str(ioe))
        return (None)
james=get_coach_data('./data/james.txt')
print(james)
复制代码

结果:

 

 我们可以自定义一个函数sanitize()来处理列表项,统一下格式问题。

1,列表迭代

复制代码
#列表迭代
def sanitize(time_string):
    if '-'in time_string:
        spliter='-'
    elif ':' in time_string:
        spliter=':'
    else:
        return (time_string)
    (mins,secs)=time_string.split(spliter)
    return (mins +'.'+secs)

with open('./data/james.txt') as j:
    data=j.readline()
    temp_james=data.strip().split(',')
    james=[]
    for a in temp_james:
        james.append(sanitize(a))
print(james)
复制代码

这里我们将一个列表转换为另一个列表要做4件事:

创建一个新列表来存放转换后的数据,迭代处理原列表中的各个数据项,每次迭代时完成转换,将转换后的数据追加到新列表。

2,列表推导

列表推导也可以完成上面的功能(排序)。

复制代码
#列表推导
def sanitize(time_string):
    if '-'in time_string:
        spliter='-'
    elif ':' in time_string:
        spliter=':'
    else:
        return (time_string)
    (mins,secs)=time_string.split(spliter)
    return (mins +'.'+secs)

with open('./data/james.txt') as j:
    data=j.readline()
    temp_james=data.strip().split(',')
    james=[sanitize(i) for i in temp_james] #列表推导
print(james)
复制代码

这里不需要append()方法。

处理好数据后来进行排序,分析所给的数据发现里面有重复项,我们可以用set()来进行处理。

复制代码
#列表去重
def sanitize(time_string):
    if '-'in time_string:
        spliter='-'
    elif ':' in time_string:
        spliter=':'
    else:
        return (time_string)
    (mins,secs)=time_string.split(spliter)
    return (mins +'.'+secs)

with open('./data/james.txt') as j:
    data=j.readline()
    temp_james=data.strip().split(',')
    james=[sanitize(i) for i in temp_james]
    unique_james=[]
    for j in james:#使用迭代删除重复
        if j not in unique_james:
            unique_james.append(j)
print(unique_james[0:3]) #列表分片
print(sorted(set(james)))#使用集合删除重复
复制代码

运行结果如下:

 

我们可以将打开文件部门放在一个自定义的函数里:

复制代码
def get_coach_data(filename):
    try:
        with open(filename) as fn:
            data=fn.readline()
            temp_data=data.strip().split(',')
            f_data=[sanitize(d) for d in temp_data]
        return (f_data)
    except IOError as ioe:
        print('File Error: '+str(ioe))
        return (None)

james=get_coach_data('./data/james.txt')
复制代码

 

附:列表数据

posted @   权杖攻城狮  阅读(460)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
历史上的今天:
2015-09-07 IE升级代码时邮件内容
点击右上角即可分享
微信分享提示