Python歌曲销量统计:文件存储与数据更新方案咨询
简单可行的解决方案
先说说你现有代码的问题
musicChart是字符串而非列表,你想用,.join(musicChart)是错误的——join会把字符串拆成单个字符来拼接,完全不是你要的效果,而且也没法和recordsBought的索引对应上。- 直接写入
str(musicChart)和str(recordsBought)会让文件内容变得一团糟(比如会带换行符、列表的方括号),后续根本没法正常读取解析。 - 没有用
with语句管理文件,容易出现文件未正确关闭的问题。
重构后的代码实现
下面是符合你需求的极简版本,包含增加销量、更新文件、读取显示三个核心功能:
chartFName = "Music Charts.txt" # 初始化数据:用列表存歌曲名,和销量列表一一对应 musicChart = ["Kathys Song", "Sunshine on Leith", "White Christmas"] recordsBought = [0, 0, 0] def save_chart_to_file(): # 用with自动管理文件,不用手动close with open(chartFName, "w", encoding="utf-8") as f: # 每行写入「歌曲名,销量」的格式,清晰易读 for song, sales in zip(musicChart, recordsBought): f.write(f"{song},{sales}\n") def load_chart_from_file(): global musicChart, recordsBought try: with open(chartFName, "r", encoding="utf-8") as f: musicChart = [] recordsBought = [] for line in f: line = line.strip() if not line: continue # 拆分每行的歌曲名和销量 song, sales = line.split(",") musicChart.append(song) recordsBought.append(int(sales)) except FileNotFoundError: # 如果文件不存在,就用初始化的数据 pass def add_sales(song_index, amount): # 检查索引是否合法 if 0 <= song_index < len(recordsBought): recordsBought[song_index] += amount save_chart_to_file() print(f"已给{musicChart[song_index]}增加{amount}销量") else: print("无效的歌曲索引!") def show_current_chart(): print("\n当前音乐榜单销量:") for idx, (song, sales) in enumerate(zip(musicChart, recordsBought)): print(f"{idx+1}. {song} - {sales} 张") # 先加载文件里的数据(如果有的话) load_chart_from_file() # 示例操作:给第2首歌加50销量 add_sales(1, 50) # 显示当前榜单 show_current_chart()
关键说明
- 用
zip()把歌曲和销量配对,确保数据对应关系不会乱。 - 文件格式用
歌曲名,销量的CSV风格,既简单又方便后续解析。 with语句自动处理文件打开/关闭,避免资源泄漏。- 加入了基本的错误处理(比如文件不存在时用初始数据,索引检查)。
- 函数拆分清晰,后续扩展功能(比如删除歌曲、修改歌曲名)也很方便。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

