Есть ли способ вызвать исключение, если файл не найден в Python? - PullRequest
0 голосов
/ 07 июня 2019

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

Код можно увидеть ниже.Я использовал заполнители для строки темы и адреса электронной почты и скрыл фактический текст письма, но вы должны быть в состоянии понять идею.Переменная email_data - это то место, куда изначально загружается файл .csv, содержащий информацию о получателе.

import csv
import datetime
import sys

import smtplib
import yagmail

import tkinter as tk
from tkinter import filedialog
from tkinter import simpledialog

root = tk.Tk()
root.withdraw()

password = simpledialog.askstring("Password", "Enter password:", show='*')

current_date = datetime.datetime.now()

subject_line = f'xyz {current_date.strftime("%B")} {current_date.year} xyz File'

LNAMES = []
FNAMES = []
EMAILS = []
FILES = []

yag = yagmail.SMTP('xyz@xyx.com', password)

email_data = filedialog.askopenfilename(filetypes=[('.csv', '.csv')],
                                        title='Select the Email Data file')


def send_email():

    with open(email_data) as csv_file:
        csv_reader = csv.reader(csv_file, delimiter=',')
        line_count = 0

        for row in csv_reader:
            last_name = row[0]
            first_name = row[1]
            email = row[2]
            file = row[3]

            LNAMES.append(last_name)
            FNAMES.append(first_name)
            EMAILS.append(email)
            FILES.append(file)

            line_count += 1

    try:
        for first_name, last_name, email, file in zip(FNAMES, LNAMES, EMAILS, FILES):
            txt = '...'
            yag.send(to=email,
                     subject=subject_line,
                     contents=[txt, file])

            print("Email(s) sent successfully")
            input("Press Enter to exit")
            sys.exit(1)

    except smtplib.SMTPAuthenticationError:
        print("Incorrect Email password entered")
        input("Press Enter to exit")
        sys.exit(1)


send_email()

Проблема, с которой я сталкиваюсь, заключается в том, что если указанный файл не находится в рабочем каталоге, электронное письмо отправляетсяс фрагментом текста в нижней части электронного письма, который говорит что-то вроде «file.xlsx» вместо фактического вложения.Есть ли способ вызвать исключение, если файл не найден, поэтому электронное письмо не просто отправляется без реального вложения?

Ответы [ 3 ]

0 голосов
/ 07 июня 2019

В качестве альтернативы, если вам не нужно исключение, вы можете просто пропустить эту строку:

with open(email_data) as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=',')
    line_count = 0

    for row in csv_reader:
        last_name = row[0]
        first_name = row[1]
        email = row[2]
        file = row[3]
        if not os.isfile(file):
            continue             # <-----

        LNAMES.append(last_name)
        FNAMES.append(first_name)
        EMAILS.append(email)
        FILES.append(file)

        line_count += 1

continue пропустит остальную часть кода и вернется к циклу for.Вы можете добавить оператор печати чуть выше continue, если хотите увидеть отзывы о том, каких из них не было.

0 голосов
/ 07 июня 2019

Использование

import os

if os.path.exists(file_path):
    do_someting()
else:
    raise SOME_ERROR()

чтобы увидеть, существует ли файл.

0 голосов
/ 07 июня 2019

Вы можете написать свои собственные исключения:

class EmailAttachmentNotFoundException(Exception):
     pass

и затем в своем коде, который присоединяет файл: (удалил остальную часть кода для ясности):

def send_email ():

with open(email_data) as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=',')
    line_count = 0

    for row in csv_reader:
        last_name = row[0]
        first_name = row[1]
        email = row[2]
        file = row[3]
        if not os.isfile(file):
            raise EmailAttachmentNotFoundException('Could not find file {} Aborting!!!!'.format(file))

        LNAMES.append(last_name)
        FNAMES.append(first_name)
        EMAILS.append(email)
        FILES.append(file)

        line_count += 1

Если вы хотите записать его по строке:

try:
    send_email()
except EmailAttachmentNotFoundException as e:
    # Modify the way the exception is raised and how it is captured, but this is the most basic way of getting what is inside 
    print(str(e))

Это печатает:

'Не удалось найти файл myfile.txt Aborting !!!!

...