我想将Outlook .msg
文件视为字符串,并检查其中是否存在子字符串。
因此,我认为导入win32
库(在类似的SO线程中建议这样做)会过分杀人。
相反,我试图以与.txt文件相同的方式打开文件:
file_path= 'O:\\MAP\\177926 Delete comiitted position.msg'
mail = open(file_path)
mail_contents = mail.read()
print(mail_contents)
但是我知道
UnicodeDecodeError: 'charmap' codec can't decode byte 0x90 in position 870: character maps to <undefined>
我可以指定要使其工作的任何解码方式吗?
我也尝试过
mail = open(file_path, encoding='utf-8')
返回
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd0 in position 0: invalid continuation byte
答案 0 :(得分:1)
除非您愿意做很多工作,否则您确实应该为此使用一个库。
首先,.msg
文件是二进制文件,因此不应将内容作为字符串读取。字符串通常以null byte
结尾,二进制文件中可能包含很多字符串,这可能意味着您没有查看所有数据(可能取决于实现)。
另外,.msg
文件在文件的不同部分/块中可以具有普通的ascii和/或unicode,因此将其视为一个字符串来搜索子字符串真的很困难。
作为一种替代方法,您可以将邮件另存为.eml
(即电子邮件的纯文本版本),但是仍然需要克服一些问题才能搜索特定的文本:>
base64
使用不同的编码,在这些编码中您永远找不到想要的文本。答案 1 :(得分:0)
当您遇到此类问题时,尝试使用Python Latin-1
编码是不错的选择。
mail = open(file_path, encoding='Latin-1')
我们经常将Windows cp1252
与实际的Python Latin-1
混淆。实际上,后者将所有可能的字节值映射到前256个Unicode代码点。
有关更多信息,请参见this。