Открыть Outlook .msg как текстовый файл в Python? - PullRequest
0 голосов
/ 04 июля 2018

Я хочу обработать файл 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

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Если вы не готовы выполнять большую работу, вам действительно следует использовать библиотеку для этого.

Во-первых, файл .msg - это двоичный файл, поэтому его содержимое не следует читать как строку. Строка обычно оканчивается на null byte, и внутри двоичных файлов может быть много таких, что может означать, что вы не просматриваете все данные (может зависеть от реализации).

Кроме того, файл .msg может содержать простые ascii и / или unicode в разных частях / блоках файла, поэтому было бы очень трудно воспринимать это как одну строку для поиска подстроки.

В качестве альтернативы вы можете сохранить письма как .eml (т. Е. Обычную текстовую версию электронного письма), но для поиска определенного текста все равно придется преодолеть некоторые проблемы:

  • Все данные в электронном письме имеют более низкий ascii (1-127), что означает, что специальные символы должны быть закодированы в младшие байты ascii. Существует несколько различных кодировок для заголовков (например, «Тема»), тела, вложения.
  • Основной текст: может быть простым текстом или hml (или и тем, и другим). Строки и слова могут быть разделены, потому что есть максимальная длина строки. Можно использовать разные кодировки, даже base64, в которых вы никогда не найдете нужный текст.
  • Для правильного декодирования всего необходимо сделать гораздо больше, но это должно дать вам представление о работе, которую вам придется выполнить, чтобы найти текст, который вы ищете.
0 голосов
/ 04 июля 2018

Когда вы сталкиваетесь с такими проблемами, рекомендуется попробовать кодировку Python Latin-1.

mail = open(file_path, encoding='Latin-1')

Мы часто путаем кодировку Windows cp1252 с фактическим Python Latin-1. Действительно, последний отображает все возможные значения байтов в первые 256 кодовых точек Unicode.

См. это для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...