Есть ли способ создать исключение, если файл не найден в python?

Я делаю программу, чтобы электронные письма можно было легко отправлять списку людей с уникальным файлом, отправляемым каждому получателю. Эта программа считывает список в виде файла .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('[email protected]', 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» вместо фактического вложения. Есть ли способ создать исключение, если файл не найден, чтобы электронное письмо не было просто отправлено без реального вложения?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
252
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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

class EmailAttachmentNotFoundException(Exception):
     pass

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

защита 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. Прерывание!!!!»

Это было решение, которое работало лучше всего для меня. В итоге я сделал попытку, кроме того, что я сделал с исключением пароля. Есть ли способ перечислить файл, который не был найден, если я использую оператор try-except, такой как except EmailAttachmentNotFoundException:?

Alex 07.06.2019 18:17

Я думаю, что вы хотите сказать, что вы хотите создать исключение EmailAttachmentNotFoundException и захватить его в другом месте, а затем посмотреть, какой файл не удалось выполнить? Вы можете зафиксировать исключение, а затем использовать его, отредактируйте ответ, чтобы сделать его понятным.

E.Serra 10.06.2019 10:21

Это было именно то, что я пытался сказать. Ваше обновленное решение работало отлично; Спасибо большое.

Alex 10.06.2019 19:25

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

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, если хотите увидеть отзывы о том, какие из них не существуют.

Использовать

import os

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

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

Другие вопросы по теме