Python文件I/O代码问题:团队统计缺失及成员交换功能异常
解决团队分组统计与成员交换的Python代码重构
看起来你的代码目前只是在做简单的逐行打印,完全没对团队数据进行分组存储和统计,交换功能也只是读取输入没做实际的修改操作。我来帮你重构代码,实现你想要的分组统计和成员交换功能。
完整修复代码
def load_team_data(file_path): teams = {"Altos": {"members": [], "total_df": 0, "total_of": 0}, "Webee": {"members": [], "total_df": 0, "total_of": 0}} with open(file_path, 'r') as fp_r: for line in fp_r: line = line.strip() if not line: continue name, df_str, of_str, team = line.split() df = int(df_str) of = int(of_str) # 添加成员到对应团队 teams[team]["members"].append({"name": name, "df": df, "of": of}) # 更新团队总DF和OF teams[team]["total_df"] += df teams[team]["total_of"] += of return teams def display_team_stats(teams): print("\n=== Team Statistics ===") for team_name, data in teams.items(): print(f"\n* {team_name} Team:") print(f" Total DF: {data['total_df']}, Total OF: {data['total_of']}") print(" Members:") for member in data["members"]: print(f" {member['name']}: DF = {member['df']}, OF = {member['of']}") def swap_member_team(teams, member_name, new_team): # 先找到成员当前所在的团队 current_team = None member_data = None for team_name, data in teams.items(): for idx, member in enumerate(data["members"]): if member["name"] == member_name: current_team = team_name member_data = data["members"].pop(idx) # 从原团队减去成员的DF和OF teams[current_team]["total_df"] -= member_data["df"] teams[current_team]["total_of"] -= member_data["of"] break if current_team: break if not current_team: print(f"Error: Member {member_name} not found!") return False if new_team not in teams: print(f"Error: Team {new_team} does not exist!") return False # 添加到新团队 teams[new_team]["members"].append(member_data) teams[new_team]["total_df"] += member_data["df"] teams[new_team]["total_of"] += member_data["of"] print(f"Successfully moved {member_name} from {current_team} to {new_team}!") return True def save_team_data(file_path, teams): with open(file_path, 'w') as fp_w: for team_name, data in teams.items(): for member in data["members"]: fp_w.write(f"{member['name']} {member['df']} {member['of']} {team_name}\n") # 主程序 if __name__ == "__main__": team_file = "Team_Assignment.txt" # 加载数据 teams = load_team_data(team_file) # 初始显示统计 display_team_stats(teams) # 交换成员功能 print("\n=== Member Swap Tool ===") print("Enter 'quit' to exit, or use format: [Member Name] [New Team] (e.g., Ba Altos)") while True: user_input = input("\nEnter swap command: ").strip() if user_input.lower() == 'quit': break if not user_input: print("Please enter a valid command!") continue parts = user_input.split() if len(parts) != 2: print("Invalid format! Use: [Member Name] [New Team]") continue member_name, new_team = parts[0], parts[1] swap_member_team(teams, member_name, new_team) # 交换后重新显示统计 display_team_stats(teams) # 询问是否保存修改 save_choice = input("\nDo you want to save the changes to the file? (y/n): ").strip().lower() if save_choice == 'y': save_team_data(team_file, teams) print("Changes saved successfully!") else: print("Changes not saved.")
原代码的核心问题分析
- 无结构化数据存储:只是逐行打印,没有将团队和成员数据分组保存,无法计算总DF/OF
- 交换功能缺失逻辑:仅读取输入字符串,没有修改数据、更新团队关联的实际操作
- 冗余代码:
if "Altos" in s判断完全多余,两个分支执行完全相同的打印代码 - 文件操作不够安全:虽然最后调用了
close(),但使用with语句能自动处理文件关闭,避免意外报错
修复后代码的关键功能说明
数据结构化加载
- 用字典存储两个团队的成员列表、总DF和总OF,方便后续统计和修改
- 自动将DF/OF转换为整数,支持数值计算
清晰的统计展示
- 按团队分组输出,先显示团队总统计,再列出所有成员的详细信息,格式清晰易读
完整的成员交换逻辑
- 自动查找成员当前所在团队,移除并更新原团队统计
- 验证目标团队是否存在,添加成员后更新新团队统计
- 包含错误提示,比如成员不存在或团队名称错误
数据持久化支持
- 可以将修改后的团队数据写回原文件,确保交换操作的结果被保存
友好的用户交互
- 明确的命令提示,支持
quit退出 - 输入格式验证,避免无效操作
- 每次交换后自动刷新显示最新统计
- 明确的命令提示,支持
内容的提问来源于stack exchange,提问作者Pia
相关产品推荐
相关产品推荐

