Windows下Python读取文件的编码问题求助
解决Windows下Python读取Outlook .msg文件的UnicodeDecodeError问题
根本原因
Outlook导出的.msg文件不是纯文本格式,而是二进制OLE复合文档,包含邮件的结构、内容、附件等二进制数据。直接用open()以文本模式读取本质上是错误的——Linux上没报错只是巧合(默认编码或文件读取兼容未触发解码错误),但实际并未正确解析文件内容;Windows下触发UnicodeDecodeError是因为文件中存在UTF-8无法解码的二进制字节(比如0xe9)。
正确解决方案:使用专门的.msg文件解析库
不要尝试用文本编码方式读取,直接用针对.msg格式开发的Python库解析:
方案1:纯Python库 extract-msg(跨平台,无需Outlook客户端)
- 安装库:
pip install extract-msg
- 示例代码:
import extract_msg import sys # 解决Windows控制台中文乱码问题 sys.stdout.reconfigure(encoding='utf-8') # 读取.msg文件 msg_file = "your_file.msg" with extract_msg.Message(msg_file) as msg: print(f"主题: {msg.subject}") print(f"发件人: {msg.sender}") print(f"邮件内容:\n{msg.body}") # 如需提取附件: # for att in msg.attachments: # att.save()
方案2:使用pywin32调用Outlook COM接口(仅Windows,需安装Outlook客户端)
- 安装库:
pip install pywin32
- 示例代码:
import win32com.client import sys # 解决Windows控制台中文乱码问题 sys.stdout.reconfigure(encoding='utf-8') # 读取.msg文件 msg_path = r"C:\path\to\your_file.msg" outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI") msg = outlook.OpenSharedItem(msg_path) print(f"主题: {msg.Subject}") print(f"发件人: {msg.SenderName}") print(f"邮件内容:\n{msg.Body}") # 关闭邮件对象 msg.Close(0)
补充:关于控制台编码的问题
如果使用上述库解析后打印中文仍乱码,可通过以下方式解决:
- 运行脚本前,在Windows命令行执行
chcp 65001切换控制台编码为UTF-8 - 或在Python脚本开头添加
sys.stdout.reconfigure(encoding='utf-8')(Python 3.7+支持)
内容的提问来源于stack exchange,提问作者user1912445
相关产品推荐
相关产品推荐

