游戏玩家CSV分数文件处理求助:按RawTime排序并打印前5最优成绩
解决CSV玩家数据排序并打印前5名的问题
没问题,我来帮你搞定这个功能!咱们用Python内置的csv模块来处理,比手动拼接字符串更可靠,也能避免很多潜在的bug。
首先先帮你改进一下现有的addtoScoreboard函数——原来的写法有个小问题(忘记给close()加括号了),而且用with语句自动管理文件会更安全,不用手动记着关闭文件:
import csv def addtoScoreboard(name, time, raw_time): # 使用with语句自动处理文件打开/关闭,避免资源泄漏 with open("scores.csv", "a", newline="", encoding="utf-8") as file: writer = csv.writer(file) writer.writerow([name, time, raw_time])
接下来是核心的排序和打印功能,我写了一个get_top_players函数,专门用来读取CSV数据、按RawTime升序排序(也就是最快的成绩在前),然后输出前5名:
def get_top_players(top_n=5): players = [] # 读取CSV文件,用DictReader可以直接通过列名访问数据,不用记索引 with open("scores.csv", "r", encoding="utf-8") as file: # 如果你的CSV文件第一行已经是表头(Name,Time,RawTime),可以去掉fieldnames参数 reader = csv.DictReader(file, fieldnames=["Name", "Time", "RawTime"]) for row in reader: # 把RawTime从字符串转成整数,这样才能正确按数值大小排序 row["RawTime"] = int(row["RawTime"]) players.append(row) # 按RawTime从小到大排序(升序) sorted_players = sorted(players, key=lambda x: x["RawTime"]) # 取前top_n个玩家 top_players = sorted_players[:top_n] # 格式化打印结果,看起来更清晰 print(f"Top {top_n} Players (Fastest First):") print("Name | Time | RawTime") print("-------------------------") for player in top_players: # 用格式化字符串对齐输出,让排版更整齐 print(f"{player['Name']:<6} | {player['Time']} | {player['RawTime']}")
关键细节说明:
- 用
csv.DictReader的好处:可以直接通过row["Name"]、row["RawTime"]这样的列名访问数据,比用索引(比如row[0])更直观,也不容易出错。 - 转换
RawTime为整数:CSV里的数值默认是字符串类型,如果直接排序会按字典序(比如"120"会比"60"靠前),转成整数后才能按真实的时长大小排序。 - 排序逻辑:
sorted函数的key参数指定按RawTime排序,默认是升序,正好符合你要的“从低到高(最快到最慢)”的需求。
测试一下
假设你的CSV文件内容是:
Name,Time,RawTime Human,02:00,120 Joe,03:00,180 Alex,01:00,60 Jason,05:00,300 Liza,06:00,360 John,07:00,420 Mark,04:00,240
调用get_top_players()后,会输出:
Top 5 Players (Fastest First): Name | Time | RawTime ------------------------- Alex | 01:00 | 60 Human | 02:00 | 120 Joe | 03:00 | 180 Mark | 04:00 | 240 Jason | 05:00 | 300
你可以直接把这两个函数集成到你的游戏代码里,调用addtoScoreboard添加新数据,调用get_top_players()展示排行榜就可以啦!
内容的提问来源于stack exchange,提问作者Pthyon
相关产品推荐
相关产品推荐

