我一直试图编写一个小应用程序来帮助我管理特定的Outlook电子邮件。我目前可以通过递归搜索来访问基于名称的各个目录。然而,我碰到了一个小小的撞击,我似乎无法克服。
import win32com.client
o = win32com.client.gencache.EnsureDispatch("Outlook.Application").GetNamespace("MAPI")
def dfr(folders, indent, tardir):
try:
for i in range(1, folders.Count+1):
run = True
folder = folders[i]
dfr(folder.Folders, indent+1, tardir)
try:
if folder.Name == tardir:
if folder.Name == None:
print(folder.Name)
raise StopIteration
print(folder.Name)
return dfr(folders[i], indent, tardir)
except StopIteration:
break
except UnboundLocalError:
pass
tf = dfr(o.Folders, 0, "Journal")
print(tf)
预期的是,该函数将递归搜索outlook,直到它在函数调用中找到指定的目录,在此示例中为" Journal"。该函数找到它,然后停在那里。因为该函数确实打印(文件夹)我知道它在期刊停止。但是,当我尝试返回文件夹时,它不会返回正确的值并等同于无。
我不需要从此功能返回其他三个变量,因为它们仅用于导航..
有什么建议吗?
编辑:回复以下评论
Printout when recursively searching through the folders.
import win32com.client
o = win32com.client.gencache.EnsureDispatch("Outlook.Application").GetNamespace("MAPI")
def dfr(folders, indent, tardir):
for i in range(1, folders.Count+1):
run = True
folder = folders[i]
print('%sFolder %d: "%s"' %('\t'*indent,i,folder.Name))
dfr(folder.Folders, indent+1, tardir)
if folder.Name == tardir:
if folder.Name == None:
print(folder.Name)
break
print(folder.Name)
return folder
tf = dfr(o.Folders, 0, "Journal")
print(tf)
答案 0 :(得分:2)
我不知道win32com api,但是如果你想进行深度优先搜索,你可以试试这样的东西。
def dfr(folders, tardir):
for folder in folders: # if `folder` follows python convention, it should be iterable.
if folder.Name == tardir: # is it the correct folder?
return folder
match = dfr(folder.Folders, tardir) # recurse into child folders
if match:
# return result from recursive call of dfr() if successful
# This was missing in your code, which is why it returns None
return match
tf = dfr(o.Folders, "Journal")
print(tf)
您的函数返回None的原因是,如果文件夹名称匹配,则只有return
。但由于这可能会在递归的几个层次上发生,因此您还必须将堆栈中的结果传播到初始调用者。如果你不这样做,python函数默认返回None
。