Streamlit中DataFrame过滤媒体消息返回0,Jupyter中正常
解决Streamlit中WhatsApp媒体消息统计返回0的问题
可能的原因及对应解决方法
换行符不一致导致匹配失败
Jupyter和Streamlit加载的聊天文件可能存在换行符差异(比如Windows系统的\r\n和Unix系统的\n),你原代码里硬编码了带\n的匹配字符串,若数据里实际是\r\n结尾,就会匹配失效。解决方法:放弃精确匹配带换行的字符串,改用更稳妥的方式:
# 去除字符串两端所有空白(包括换行、空格、制表符)后匹配 no_of_media = df[df['message'].str.strip() == '<Media omitted>'].shape[0] # 或者直接用包含匹配(仅当消息中只有该标记时适用) no_of_media = df[df['message'].str.contains('<Media omitted>')].shape[0]存在隐藏空白或编码差异
导出的WhatsApp聊天记录里,<Media omitted>前后可能存在看不见的空白字符(比如全角空格),或者读取文件时的编码细微差异导致字符串不匹配。解决方法:在Streamlit中添加调试代码,查看疑似媒体消息的原始字符细节:
st.write("调试:前10条消息的原始内容与字符编码") for idx, msg in enumerate(df['message'].head(10)): st.write(f"{idx}: 内容='{msg}' | 长度={len(msg)} | 字符ASCII码={[ord(c) for c in msg]}")通过ASCII码可以快速定位是否有额外字符(比如
\r对应ASCII码13),再针对性处理。数据类型异常
若Streamlit加载数据时,message列被识别成非字符串类型(比如object类型但实际包含非字符串值),会导致字符串匹配逻辑失效。解决方法:强制转换为字符串类型后再执行统计:
df['message'] = df['message'].astype(str) no_of_media = df[df['message'].str.strip() == '<Media omitted>'].shape[0]
额外调试技巧
在Streamlit中直接展示匹配到的行,确认是否真的没有符合条件的数据:
st.write("匹配到的媒体消息:") st.dataframe(df[df['message'].str.contains('<Media omitted>')])
如果这里能显示数据,说明统计逻辑没问题,可能是后续展示环节的问题;如果仍为空,就回到前面的步骤排查字符串差异。
内容的提问来源于stack exchange,提问作者Aditya
相关产品推荐
相关产品推荐

