Создать фрейм данных из вложения Excel в Outlook - PullRequest
0 голосов
/ 27 декабря 2018

Можно ли прочитать файл Excel из вложения Outlook, не сохраняя его, и вернуть кадр данных pandas из вложенного файла?Файл всегда будет в том же формате.

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Вы можете использовать exchangelib , чтобы соединиться с Outlook и найти вложение.

Как только он найден, содержимое вложения может быть извлечено.Это будет файл Excel в виде байтовой строки.

Метод pandas.read_excel может использоваться для чтения файлов Excel в кадр данных.Этот метод может читать файл Excel в памяти, если в качестве аргумента вы предоставляете файлоподобный объект.

* Панды PS могут не указывать библиотеку xlrd в качестве зависимости, и вам может потребоваться установить xlrd отдельно, чтобы воспользоваться pandas.read_excel.*

Для преобразования содержимого вложения (байтовой строки)к файлообразному объекту вы можете передать байтовую строку в io.BytesIO.

Я смог заставить это работать, отправив мне по электронной почте файл с именем file.xls с темой сообщения the email subject you are expecting.Возможно, вы сможете приспособиться к вашим потребностям:

import io
from exchangelib import Credentials, Account, DELEGATE
import pandas

# Connect to outlook (many ways to do this, take a look at exchangelib link above)
credentials = Credentials('MYWINDOMAIN\\myusername', 'mypassword')
account = Account(
    primary_smtp_address='myusername@example.com', 
    config=config,
    autodiscover=True,
    access_type=DELEGATE
)

# Find the items in the inbox matching the email subject you specify
item = account.inbox.all().get(subject='the email subject you are expecting')

# Iterate through the attachments and match with the filename you specify
# The attachment content will be the excel file in the form of a byte string
for attachment in item.attachments:
    if attachment.name == 'file.xlsx':
        my_excel_file_in_bytes = attachment.content
        break
else:
    assert False, 'No attachment with that name'

# Now that you have the excel file in bytes, convert to a file-like
# object and read the excel file in memory
my_excel_file_io = io.BytesIO(my_excel_file_in_bytes)
pandas_data_frame = pandas.read_excel(io=my_excel_file_io)
0 голосов
/ 28 декабря 2018

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

То, что вы хотите, это дать пандам идентификаторэлектронной почты, имя вложения, сведения о хранилище сообщений и подходящей аутентификации, и панды читают вложение напрямую.Это повлечет за собой расширение функции pandas.read_csv() или добавление новой функции read_csv_attachment().

Хотя я уверен, что это возможно, это более амбициозный проект, чем я (как незнакомый с внутренностями панд) хотел бы заняться собой.И, конечно, гораздо больше работы, чем сохранение вложений вручную, если у вас их нет.

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