NameError: имя 'att' не определено при использовании Python для загрузки приложения Excel - PullRequest
0 голосов
/ 30 апреля 2019

При использовании Python 2.7 для автоматической загрузки вложений Excel из Outlook, я получаю сообщение об ошибке: NameError: имя 'att' не определено. Как ни странно, код работал до сегодняшнего дня.

Я попытался переместить: 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')

1 Ответ

1 голос
/ 30 апреля 2019

Если список вложений пуст или ни одно из att.FileName не установлено, то вы получите сообщение об ошибке выше. Есть хороший трюк с питоном, чтобы избежать этого: вы можете использовать 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 приложение?

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