Python处理WhatsApp导出TXT聊天记录时Time为空、Name输出错误问题
问题原因
- Time为空的核心原因:截取date后,剩余字符串开头保留了date后的空格,直接对
line2执行split(" ")得到的第一个元素是空字符串,切片[:2]后仍然为空。 - Name字段不符合预期的原因:一是截取time后的
line3开头同样残留空格,未做去除就直接拆分;二是强制取拆分结果前4个字符的逻辑不符合实际用户名长度规则,只会截断出错误内容。 - 隐藏错误:
cleaned_data.append语句缩进错误,处于for循环外部,只会将循环结束后最后一行的解析结果加入列表,最终DataFrame默认只有1行数据。 - 路径潜在风险:Windows文件路径直接用反斜杠可能触发转义字符解析,导致文件读取失败。
解决方案
WhatsApp导出的TXT文件每行标准格式为日期 时间 - 用户名: 消息内容,直接硬编码切片长度的解析逻辑兼容性极差,推荐按格式拆分的逻辑实现,修正后代码如下:
import pandas as pd # 用原始字符串定义路径避免转义问题 file_path = r'D:\Analysis\example_chat_whatsapp.txt' with open(file_path, encoding="utf-8") as f: data = f.readlines() print('总行数: %s' %(len(data))) cleaned_data = [] # 跳过首行系统通知消息 dataset = data[1:] # 用于拼接换行的多行长消息 prev_msg = None for line in dataset: line = line.strip() # 跳过空行 if not line: continue # 判断是否为带时间戳的新消息行 if ' - ' in line and line.split(' - ')[0].count('/') == 2 and ':' in line.split(' - ')[0]: # 先存储上一条解析完成的消息 if prev_msg: cleaned_data.append(prev_msg) # 拆分时间戳部分和内容部分 time_part, content_part = line.split(' - ', 1) date, time = time_part.split(' ', 1) # 拆分用户名和消息内容 if ':' in content_part: name, message = content_part.split(':', 1) name = name.strip() message = message.strip() prev_msg = [date, time, name, message] else: # 属于上一条消息的换行内容,拼接至消息字段 if prev_msg: prev_msg[3] += f'\n{line}' # 存入最后一条消息 if prev_msg: cleaned_data.append(prev_msg) # 生成结果DataFrame df = pd.DataFrame(cleaned_data, columns = ['Date', 'Time', 'Name', 'Message']) # 如需导出为文件可执行下行代码 # df.to_csv('whatsapp_chat_result.csv', index=False, encoding='utf-8-sig')
内容的提问来源于stack exchange,提问作者jfcb
相关产品推荐
相关产品推荐

