Извлечение чисел из тела письма Outlook с Python - PullRequest
0 голосов
/ 31 мая 2018

Я получаю ежечасные оповещения по электронной почте, которые сообщают мне, какой доход компания получила за последний час.Я хочу извлечь эту информацию в фрейм данных Pandas, чтобы можно было провести на нем некоторый анализ.

Моя проблема в том, что я не могу понять, как извлечь данные из тела письма в удобном для использования формате.Я думаю, что мне нужно использовать регулярные выражения, но я не слишком знаком с ними.

Это то, что у меня есть:

import os
import pandas as pd
import datetime as dt
import win32com.client

outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
inbox = outlook.GetDefaultFolder(6)
messages = inbox.Items

#Empty Lists
email_subject = []
email_date = []
email_content = []

#find emails

for message in messages:
    if message.SenderEmailAddress == 'oracle@xyz.com' and message.Subject.startswith('Demand'):
        email_subject.append(message.Subject)
        email_date.append(message.senton.date()) 
        email_content.append(message.body)

Список email_content выглядит следующим образом:

'                                                                                                                   \r\nDemand: $41,225 (-47%)\t                                                                            \r\n                                                                                                                       \r\nOrders: 515 (-53%)\t                                                                                \r\nUnits: 849 (-59%)\t                                                                                 \r\n                                                                                                                       \r\nAOV: $80 (12%)                                                                                                          \r\nAUR: $49 (30%)                                                                                                          \r\n                                                                                                                       \r\nOrders with Promo Code: 3%                                                                                              \r\nAverage Discount: 21%                                                                                             '

Может кто-нибудь сказать мне, как я могу разделить его содержимое, чтобы я мог получить значение int Спрос, Заказы и Единицы в отдельных столбцах?

Спасибо!

1 Ответ

0 голосов
/ 31 мая 2018

Вы можете использовать комбинацию string.split () и string.strip (), чтобы сначала извлечь каждую строку отдельно.

string = email_content
lines = string.split('\r\n')
lines_stripped = []
for line in lines:
    line = line.strip()
    if line != '':
        lines_stripped.append(line)

Это дает массив, подобный следующему:

['Demand: $41,225 (-47%)', 'Orders: 515 (-53%)', 'Units: 849 (-59%)', 'AOV: $80 (12%)', 'AUR: $49 (30%)', 'Orders with Promo Code: 3%', 'Average Discount: 21%']

Вы также можете добиться того же результата более компактным (питоническим) способом:

lines_stripped = [line.strip() for line in string.split('\r\n') if line.strip() != '']

Получив этот массив, вы используете регулярные выражения, как вы правильно догадались, для извлечения значений.Я рекомендую https://regexr.com/ поэкспериментировать с вашими выражениями регулярных выражений.

После некоторых быстрых экспериментов r'([\S\s]*):\s*(\S*)\s*\(?(\S*)\)?' должен сработать.

Вот код, который выдает подсказку из ваших строк.созданный выше:

import re
regex = r'([\S\s]*):\s*(\S*)\s*\(?(\S*)\)?'
matched_dict = {}
for line in lines_stripped:
    match = re.match(regex, line)
    matched_dict[match.groups()[0]] = (match.groups()[1], match.groups()[2])

print(matched_dict)

Это приводит к следующему выводу:

{'AOV': ('$80', '12%)'),
 'AUR': ('$49', '30%)'),
 'Average Discount': ('21%', ''),
 'Demand': ('$41,225', '-47%)'),
 'Orders': ('515', '-53%)'),
 'Orders with Promo Code': ('3%', ''),
 'Units': ('849', '-59%)')}

Вы запросили Единицы, Заказы и Спрос, поэтому вот извлечение:

# Remove the dollar sign before converting to float
# Replace , with empty string
demand_string = matched_dict['Demand'][0].strip('$').replace(',', '')
print(int(demand_string))
print(int(matched_dict['Orders'][0]))
print(int(matched_dict['Units'][0]))

Как вы можете видеть, Demand немного сложнее, потому что он содержит некоторые дополнительные символы, которые Python не может декодировать при преобразовании в int.

Вот окончательный результат этих трех отпечатков:

41225
515
849

Надеюсь, я ответил на ваш вопрос!Если у вас есть еще вопросы о регулярном выражении, я советую вам поэкспериментировать с регулярным выражением, оно очень хорошо построено!

РЕДАКТИРОВАТЬ: похоже, в регулярном выражении есть небольшая проблема, приводящая к тому, что заключительный ')' будет включен впоследняя группа.Это не влияет на ваш вопрос, хотя!

...