Python统计文本文件音乐流派数量,代码返回0如何解决
问题原因&解决方案
核心问题点
- 缩进错误:Python函数体内的代码必须相对于
def语句缩进4个空格,你当前写的文件读取、变量初始化、循环、打印逻辑全部没有缩进,不属于函数体内容。如果仅定义函数未主动调用,整个统计逻辑根本不会执行,自然所有计数都是0。 - 字符串匹配失败:原始数据按逗号分割后,genre字段大概率前后带有多余空格(比如原始行格式是
artist, title, Rock, play length...,逗号后自带空格),此时分割得到的row[2]实际是" Rock ",和你写的"Rock"精确匹配不上,不会触发计数。 - 逻辑顺序错误:你先判断行首是否为
#,再执行rstrip()清理换行符,未清理的换行符可能导致判断异常,遇到空行还会触发索引报错。 - 资源泄漏风险:文件打开后没有显式关闭,可能会导致文件资源占用异常。
修正后代码
def count_genres(): # 用with语句自动管理文件关闭,避免资源泄漏 with open("RECORD_DATA.txt", 'r', encoding='utf-8') as file: rock = 0 classical = 0 pop = 0 jazz = 0 spoken_word = 0 for row in file: # 先清理首尾空白、跳过空行和注释行 clean_row = row.strip() if not clean_row or clean_row.startswith("#"): continue # 分割后对每个字段清理多余空格 fields = [f.strip() for f in clean_row.split(",")] genre = fields[2] # 统一转小写匹配,避免大小写不一致导致统计遗漏 genre_lower = genre.lower() if genre_lower == "rock": rock += 1 elif genre_lower == "classical": classical += 1 elif genre_lower == "pop": pop += 1 elif genre_lower == "jazz": jazz += 1 elif genre_lower == "spoken word": spoken_word += 1 print("Amount of Records in each genre ") print("Rock: ", rock) print("Classical: ", classical) print("Pop: ", pop) print("Jazz: ", jazz) print("Spoken Word: ", spoken_word) # 可返回字典供后续逻辑调用 return {"Rock": rock, "Classical": classical, "Pop": pop, "Jazz": jazz, "Spoken Word": spoken_word} # 主动调用函数才会执行统计逻辑 count_genres()
内容的提问来源于stack exchange,提问作者Damian Wnukiewicz
相关产品推荐
相关产品推荐

