Python 从.msg文件中提取.xlsx附件

Python 从.msg文件中提取.xlsx附件,python,vba,attachment,data-extraction,Python,Vba,Attachment,Data Extraction,我知道这已经被问过好几次了,我也尝试过一些显然对其他人有效的方法……我有1000多个Outlook.msg文件,其中包含.xlsx文件附件,存储在我桌面上的文件夹中,我只需要提取.xlsx文件就可以合并到一个数据帧中 我已经试过了,Python[Win32]()和。我能做的最好的事情就是从一个.msg文件中提取一个附件 非常感谢您的建议。谢谢大家! import argparse import csv import os as os import pathlib import sys from

我知道这已经被问过好几次了,我也尝试过一些显然对其他人有效的方法……我有1000多个Outlook.msg文件,其中包含.xlsx文件附件,存储在我桌面上的文件夹中,我只需要提取.xlsx文件就可以合并到一个数据帧中

我已经试过了,Python[Win32]()和。我能做的最好的事情就是从一个.msg文件中提取一个附件

非常感谢您的建议。谢谢大家!

import argparse
import csv
import os as os
import pathlib
import sys
from datetime import date, datetime, timedelta, tzinfo
from enum import Enum, IntEnum
from tempfile import mkstemp

import dateutil.parser as duparser
from dateutil.rrule import rrulestr, rruleset
import pywintypes
import pytz
import win32com.client  

path = r'C:\Users\Me\Desktop\MyFiles\feb_2018'
files = [f for f in os.listdir(path) if '.msg' in f]
print (files)
for file in files:
    outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
    msg = outlook.OpenSharedItem(os.path.join(path, file))
    att=msg.Attachments
    for i in att:
        i.SaveAsFile(os.path.join(path, i.FileName))       



我没有尝试使用win32com保存附件,因此我无法说明为什么只保存单个文件中的单个附件。但是我可以使用


谢谢大家!!实际上,我想出了一个解决方案,通过在Win32中包含一个计数器来提取多个文件:

   path = r'C:\Users\filepath' #change path to directory where your msg files are located
   files = [f for f in os.listdir(path) if '.msg' in f]
   print (files)
   counter=0
   for file in files:
       outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
       msg = outlook.OpenSharedItem(os.path.join(path, file))
       att=msg.Attachments
       for i in att:
           counter +=1
           i.SaveAsFile(os.path.join(path, str(counter)+i.FileName))

VBA宏似乎工作得最好,但只提取了1个文件,代码中是否缺少某个命令?
   path = r'C:\Users\filepath' #change path to directory where your msg files are located
   files = [f for f in os.listdir(path) if '.msg' in f]
   print (files)
   counter=0
   for file in files:
       outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
       msg = outlook.OpenSharedItem(os.path.join(path, file))
       att=msg.Attachments
       for i in att:
           counter +=1
           i.SaveAsFile(os.path.join(path, str(counter)+i.FileName))