如何修复Python统计词频时出现的TypeError: 'str' object is not callable错误?
解决你的Python词频排序&CSV导出问题
嘿,我来帮你搞定这个报错和需求!先给你拆解问题,再给你修正后的完整代码,还包含你想要的CSV导出功能。
首先分析报错原因
你遇到的TypeError: 'str' object is not callable是因为字符串格式化语法错误:
- 你写的是
print("%s : %i %" (word, frequency)),这里把格式化字符串当成了函数去调用(用了括号),而且还多了一个多余的%。 - 正确的用法应该是用
%运算符连接格式化字符串和参数元组:"%s : %i" % (word, frequency)
还有几个需要优化的小问题
除了报错,代码还有几个可以完善的地方:
- 用
split(" ")分割文本会产生空字符串(比如连续空格、换行的情况),应该用默认的split(),它会自动处理所有空白字符(空格、换行、制表符等)。 - 你在
words_and_frequencies里把单词包成了列表[word],后面打印的时候会输出类似[apple] : 5的格式,没必要,直接存word就行。
修正后的完整代码(含CSV导出)
下面是修复了报错、优化了逻辑,并且添加了CSV导出功能的代码:
from collections import defaultdict import csv # 第一步:统计参考文档的词频 occurrences = defaultdict(int) with open("booksandtranscripts.txt", "r", encoding="utf-8") as file: books_content = file.read() # 用默认split()分割,自动处理所有空白字符 for word in books_content.split(): occurrences[word] += 1 # 第二步:获取目标文档的单词,并匹配词频 words_with_frequencies = [] with open("allminow.txt", "r", encoding="utf-8") as file: allminow_content = file.read() for word in allminow_content.split(): # 直接存(词频, 单词),注意这里如果单词不存在,defaultdict会返回0 words_with_frequencies.append((occurrences[word], word)) # 第三步:按词频排序(默认升序,想要降序可以加reverse=True) # 注意sorted的时候,我们要按词频排序,所以排序后元素是(频率, 单词),需要交换顺序打印 for frequency, word in sorted(words_with_frequencies, reverse=True): print(f"{word} : {frequency}") # 也可以用f-string,比%格式化更直观 # 第四步:导出到CSV文件 with open("word_frequencies.csv", "w", newline="", encoding="utf-8") as csvfile: writer = csv.writer(csvfile) # 写入表头 writer.writerow(["单词", "词频"]) # 写入数据,注意交换顺序,让CSV里是单词在前,词频在后 for frequency, word in sorted(words_with_frequencies, reverse=True): writer.writerow([word, frequency])
代码说明
- 我把变量名改成了更规范的
occurrences(你之前拼写成了occurences,虽然不影响运行,但规范更好)。 - 添加了
encoding="utf-8",避免读取/写入文件时出现编码问题。 - 用了更直观的f-string格式化打印,你也可以继续用
%格式化,只要语法正确就行。 - CSV导出部分用了Python内置的
csv模块,确保格式正确,不会出现逗号分隔的问题。 - 排序时加了
reverse=True,这样词频高的单词排在前面,如果你想要升序可以去掉这个参数。
内容的提问来源于stack exchange,提问作者Youssef A
相关产品推荐
相关产品推荐

