WhatsApp聊天分析脚本触发KeyError:3327问题求助
解决KeyError: 3327 & 正确统计消息数
嘿,我来帮你搞定这个问题!首先说你的KeyError: 3327——这是因为你写的while True是个无限循环,没有设置停止条件。当循环变量i涨到3327时,你的DataFrame已经没有对应索引的行(你的数据总共只有3327行,索引从0到3326),自然就抛出这个错误了。
另外,我注意到你的统计逻辑也有问题:你现在是每天只取第一条消息来统计作者,这和你想要统计Umesh Yadav的总消息数的需求完全不符,会导致结果完全错误。咱们一起修正这两个问题:
一、快速修复:用Pandas高效统计(推荐)
Pandas就是用来做这种数据统计的,完全不需要手动写循环,代码简洁还高效。直接用这几行就能得到你要的结果:
# 统计Umesh Yadav的消息数 u_count = len(df[df['Author'] == 'Umesh Yadav']) # 其他用户的消息数 = 总消息数减去Umesh的数量 h_count = len(df) - u_count print(f"Umesh Yadav的消息总数: {u_count}") print(f"其他用户的消息总数: {h_count}")
如果你还想看看所有用户的消息分布,用value_counts()更直观:
# 获取所有用户的消息统计 author_stats = df['Author'].value_counts() # 提取Umesh的数量,要是没有这个用户就返回0 u_count = author_stats.get('Umesh Yadav', 0) # 其他用户总和 h_count = author_stats.sum() - u_count # 先打印所有用户的统计 print("所有用户消息统计:") print(author_stats) print(f"\nUmesh Yadav: {u_count}条") print(f"其他用户总计: {h_count}条")
二、如果你非要保留循环写法(不推荐,效率低)
要是你想坚持用循环,那必须给循环加终止条件,同时修正统计逻辑(要遍历每一条消息,不是每天第一条):
total_messages = len(df) h_count = 0 u_count = 0 # 用for循环代替while,避免无限循环 for i in range(total_messages): current_author = df['Author'].iloc[i] if current_author == 'Umesh Yadav': u_count += 1 else: h_count += 1 print(f"Umesh Yadav的消息数: {u_count}") print(f"其他用户的消息数: {h_count}")
额外的优化建议
- 正则表达式可能漏匹配:你当前的正则
pattern可能无法覆盖所有WhatsApp消息格式(比如带特殊字符的用户名、非英语消息),可以换成更通用的版本:pattern = r'^(\d{1,2}/\d{1,2}/\d{2,4}), (\d{1,2}:\d{2}\s[APM]{2}) - (.*?): (.*)' - 避免漏掉最后一条消息:当前代码在文件读完后,最后一条消息可能没被存入
parsedData,可以在while True循环结束后加这段代码:# 保存最后一条未处理的消息 if len(messageBuffer) > 0 and date and time and author: parsedData.append([date, time, author, ' '.join(messageBuffer)])
内容的提问来源于stack exchange,提问作者Harishchandra
相关产品推荐
相关产品推荐

