【问题标题】:NameError: name 'att' is not defined when using Python to download Excel AttachmentNameError: 使用 Python 下载 Excel 附件时未定义名称“att”
【发布时间】:2019-04-30 22:49:54
【问题描述】:

使用 Python 2.7 从 Outlook 自动下载 Excel 附件时,我收到一条错误消息:NameError: name 'att' is not defined。奇怪的是,代码到今天都运行良好。

我尝试移动:att.SaveAsFile 到内部循环。

# Imports arcpy library (Python for ArcGIS) and other libraries required
import arcpy
import os
import sys
import datetime
import win32com.client
from win32com.client import Dispatch
import csv
import pandas as pd
import numpy as np
from tempfile import NamedTemporaryFile
import logging
#import string

"""
Part I:  Downloads Excel Spreadsheet (Named Test) from Outlook
"""
# Reference: https://stackoverflow.com/questions/22399835/how-to-save-attachment-from-outlook-using-win32com-client-in-python
outlook = Dispatch("Outlook.Application").GetNamespace("MAPI")
inbox = outlook.GetDefaultFolder("6")
all_inbox = inbox.Items
#messages= msg.Attachments
val_date = datetime.date.today()

sub_today = 'Test ' + date_string
att_today = 'Test ' + date_string+'.xlsx'

# Loop through messages and stop at message with today's subject and attachment.
for msg in all_inbox:
    if msg.Subject:
        new=msg.Subject
        if new.find('Test') !=-1 & new.find(date_string) !=-1:
            #print("Step 1")
            break

for att in msg.Attachments:
    if att.FileName:
        #print("Step 2")
        break

# Change Directory and Save Attachment  
os.chdir('My Directory')
att.SaveAsFile(os.getcwd()+'\\'+att_today)
logging.info('Finished Attachment Download')

【问题讨论】:

  • 如果msg.Attachments 为空则未定义。
  • 为了说明,运行for att in []: pass,然后运行print(att),它会给你同样的NameError。
  • 我认为 Yevhen 的评论是正确的,在这种情况下。

标签: python outlook download attachment


【解决方案1】:

如果附件列表为空,或者没有设置 att.FileName,那么您会收到上述错误。有一个很好的 python 技巧可以避免它:你可以使用else 来进行for 循环。 else 中的代码将在您遍历集合并且从未命中 break 时执行。

示例如下:

log = logging.getLogger(__name__)

for att in msg.Attachments:
    if att.FileName:
        break
else:
    log.error("file is not found")
    att = None

if att:
    att.SaveAsFile(att_today)
    log.info('Finished Attachment Download')

只有 1 个附件吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-20
    • 2013-01-26
    • 1970-01-01
    • 2016-11-30
    • 2017-03-08
    • 2020-09-04
    • 2021-10-18
    相关资源
    最近更新 更多