对推文CSV文件做词频统计时触发IndexError: list index out of range错误
解决推文词频统计代码的索引越界错误
嘿,我来帮你搞定这个问题!你遇到的IndexError是因为CSV文件里有些行没有第二列数据,导致代码尝试访问row[1]的时候找不到对应的元素。咱们一步步修复这个问题,顺便优化下你的代码,让它更高效可靠:
错误原因分析
Traceback (most recent call last): File "wordcount.py", line 11, in csv_words = row[1].split(" ") IndexError: list index out of range
这个错误明确告诉你:当前遍历到的row列表长度小于2,也就是这一行的列数不足。可能是CSV里存在空行,或者某些推文行的格式有问题,缺少第二列的文本内容。
修正后的完整代码
我优化了你的代码,解决了索引问题,同时提升了词频统计的效率,还加入了单词清理逻辑(避免大小写、标点干扰统计):
import csv from collections import Counter def clean_word(word): # 清理单词:转小写、去除前后空白、移除常见标点 cleaned = word.strip().lower().strip('.,!?()"') return cleaned if cleaned else None words = [] with open('Hometovotetweets.csv', 'r', encoding='utf-8') as csvfile: reader = csv.reader(csvfile) next(reader) # 跳过CSV表头 for row_num, row in enumerate(reader, start=2): # 从第2行开始计数(表头是第1行) # 先检查当前行是否有至少2列数据,避免索引越界 if len(row) < 2: print(f"⚠️ 警告:第{row_num}行数据格式异常,已跳过") continue tweet_text = row[1] # 拆分并清理每个单词 for word in tweet_text.split(" "): cleaned_word = clean_word(word) if cleaned_word: words.append(cleaned_word) # 用Counter高效统计词频,比手动遍历count快N倍 word_counts = Counter(words) # 将统计结果写入新CSV with open('HTVwordcount.csv', 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f) writer.writerow(['单词', '出现次数']) # 写入表头 # 按出现次数从高到低写入 for word, count in word_counts.most_common(): writer.writerow([word, count])
关键修复&优化点
- 修复模块导入错误:把错误的
import csv from collections import Counter拆分成两行正确的导入语句 - 添加索引安全检查:在访问
row[1]前先判断行长度,避免越界,同时打印警告提示异常行号 - 高效词频统计:用
collections.Counter代替手动调用words.count(i),尤其是数据量大的时候,效率提升非常明显 - 单词清理逻辑:统一转小写、移除标点和空白,避免同一个单词因为大小写(比如"Vote"和"vote")或标点(比如"vote."和"vote")被统计成不同条目
- 修复CSV写入错误:原来的
edgl是未定义变量,现在用统计后的word_counts;同时使用Python3推荐的文本模式'w'(而非二进制'wb'),添加newline=''避免输出CSV出现多余空行 - 新增表头:让输出的CSV文件更易读
额外提醒
如果你的CSV文件不是用逗号分隔的(比如制表符),需要在csv.reader里指定分隔符,比如:
reader = csv.reader(csvfile, delimiter='\t')
内容的提问来源于stack exchange,提问作者Vincent Ryan
相关产品推荐
相关产品推荐

