Как извлечь данные из MSG-файлов и вставить (добавить) их в CSV-файл? - PullRequest
1 голос
/ 09 марта 2020

Я делаю скрипт, который извлекает определенные данные (Subject, Date, Sender) из сохраненного сообщения Outlook (расширение .msg), и я хочу заполнить данные в CSV-файле по одной строке за раз.

Таким образом, сценарий должен go через файл папки с расширением msg и извлечь данные. Это то, что я мог придумать до сих пор.

Этот код создает исходный файл, но он копирует те же данные из первого прочитанного электронного письма X раз вместо перехода к следующему.

import os
import glob
import csv
import win32com.client

outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")

files = glob.glob('PATH_TO_FILES\\*.msg')


for file in files:
    msg = outlook.OpenSharedItem(file)



    #print(file)

    #with open(file) as f:

        #msg=f.read()

        #print(msg)


    with open(r'Email.csv', mode='w') as file:
        fieldnames = ['Subject', 'Date', 'Sender']
        writer = csv.DictWriter(file, fieldnames=fieldnames)
        writer.writeheader()

        #for f in os.listdir('.'):
        for f in files:


            #if not f.endswith('.msg'):
                #continue

    #msg = msg.Message(f)
                msg_sender = msg.SenderName
                msg_date = msg.SentOn
                msg_subj = msg.Subject
    #msg_message = msg.Body

                writer.writerow({'Subject': msg_subj, 'Date': msg_date, 'Sender': msg_sender})

1 Ответ

1 голос
/ 09 марта 2020

Это довольно жестокая ошибка ...

Просто посмотрите на свою структуру:

for file in files:
    msg = outlook.OpenSharedItem(file)
    with open(r'Email.csv', mode='w') as file:
        for f in files:
            # process msg

и следите за тем, что происходит:

  • вы л oop поверх файлов MSG
    • вы сохраняете один
    • вы открываете файл CSV в режиме 'w', стирая все предыдущие данные
    • вы снова oop через MSG файлы
      • и обработка сохраненного файла

Таким образом, у вас есть 2 уровня l oop сверх файлы msg, и каждая внешняя итерация сбрасывает файл csv. В конце концов, только последний из них имеет значение и обрабатывает n раз один и тот же последний файл.

Как исправить: просто l oop один раз над файлами, после открытия файла csv:

with open(r'Email.csv', mode='w') as file:
    for f in files:
        msg = outlook.OpenSharedItem(f)
        # process msg
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...