使用extract_msg处理.msg文件时try-except块莫名打印‘hello’求助
extract_msg捕获NotImplementedError时自动打印"hello"的问题解决
问题场景
用extract_msg包批量分析.msg文件时,遇到包含附件的文件会抛出NotImplementedError,已经用try-except块捕获该异常,但每次触发异常时都会自动打印"hello",自己的代码里完全没有写这个打印语句,十分困惑。
有人建议修改glob路径写法:
原代码:
#f-variabele f = glob.glob(r'D:\AA Brenda\Python\DVS_lang\*\*.msg', recursive=True)
修改为:
f = glob.glob(r'D:/AA Brenda/Python/DVS_lang/**/*.msg', recursive=True)
我的核心循环代码如下:
#loop over folders paths =[] senders = [] recipients = [] dates = [] subjects = [] body = [] #append data to lists: for filename in f: try: msg = extract_msg.Message(filename) paths.append(filename) senders.append(msg.sender) recipients.append(msg.to) dates.append(msg.date) subjects.append(msg.subject) body.append(msg.body) except NotImplementedError: #"NotImplementedError: Current version of ExtractMsg.py does not #support extraction of containers that are not embeded msg files." print("")
原因分析
这个自动打印的"hello"大概率是extract_msg包内部的调试遗留代码,不是你的代码问题。有些开发者在开发库时会添加临时调试打印,可能忘记移除,当触发相关异常时就会输出这个内容。
另外,关于路径修改的建议:这个改动是为了让glob能递归遍历所有子目录(**配合recursive=True才会深度递归,原代码的*只遍历下一级目录),但它和自动打印"hello"的问题无关,只是解决文件查找范围的问题。
解决方案
1. 升级extract_msg到最新版本
优先尝试升级包,官方通常会在后续版本中移除调试代码:
pip install --upgrade extract_msg
2. 临时抑制包内部的输出
如果暂时无法升级,可以在创建extract_msg.Message对象时重定向标准输出,避免包内部的打印内容干扰:
import sys from contextlib import redirect_stdout #loop over folders paths =[] senders = [] recipients = [] dates = [] subjects = [] body = [] #append data to lists: for filename in f: try: # 临时将stdout重定向到stderr,避免包内调试打印干扰 with redirect_stdout(sys.stderr): msg = extract_msg.Message(filename) paths.append(filename) senders.append(msg.sender) recipients.append(msg.to) dates.append(msg.date) subjects.append(msg.subject) body.append(msg.body) except NotImplementedError: # 可改为记录日志或直接跳过 pass
3. 替换为支持附件的库
如果需要处理带附件的.msg文件,extract_msg当前版本不支持的话,可以考虑用其他库:
- pywin32(仅Windows环境):直接调用Outlook的COM接口处理.msg文件,对附件支持更完善
- msg-parser:另一个处理.msg文件的Python库,可尝试是否适配你的附件场景
内容的提问来源于stack exchange,提问作者brenda89
相关产品推荐
相关产品推荐

