С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
 Аватар для Oxidous
4 / 4 / 1
Регистрация: 03.09.2014
Сообщений: 156

Условие срабатывает в любом случае

09.05.2021, 23:53. Показов 771. Ответов 5

Студворк — интернет-сервис помощи студентам
Всем доброго времен суток.
Если коротко, то программа сверяет сегодняшнее число (месяц и день) с месяцем и днём рождения людей из списка 'birthdays.csv'.
Сам список такого вида:
Вася,vasia@mail.ru,1982,05,09
Петя,petia@gmail.com,1995,11,17

Сегодняшнее число подаётся в таком виде: '5-9' (Месяц и число)
Месяц и день из списка тоже подаются в таком виде: '5-9'

Если совпадения найдены, то такому человеку отправляется поздравительное письмо. Если не найдены, то выводится информационное окно о том, что письмо не отправлено, потому как никто не празднует сегодня ДР.
Помогите разобраться, почему срабатывает самое последнее else условие (Именинники не найдены) даже в том случае, если в списке есть именинники. То есть, если именинники есть в списке, то всё равно выдает несколько раз окно с сообщением от том, что именинников нет, а потом высылает письма именинникам.

Пробовал так, но результат такой же:

Python
1
2
elif:
    current_mmdd != f"{b_date_list['month'][md]}-{b_date_list['day'][md]}":

Сам код:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
from tkinter import *
import pandas, datetime, random, smtplib, glob
from tkinter import messagebox
import winsound
 
def send_mail():
    data = pandas.read_csv("birthdays.csv")
    current_time = datetime.datetime.now()
    current_day = current_time.day
    current_month = current_time.month
    current_mmdd = f"{current_month}-{current_day}"
    b_date_list = data.to_dict()
    for md in range(len(b_date_list['name'])):
        if current_mmdd == f"{b_date_list['month'][md]}-{b_date_list['day'][md]}":
            receiver_name = b_date_list['name'][md]
            receiver_mail = b_date_list['email'][md]
            rand_letter = random.choice(glob.glob('./letter_templates/*.txt'))
            with open(rand_letter) as b_day_letter:
                with open("from_rand_let.txt", "w") as bday_let_text:
                    for line in b_day_letter:
                        bday_let_text.write(line.replace('[NAME]', receiver_name))
            with open("from_rand_let.txt", "r") as bday_text:
                text = bday_text.read()
            from_mail = mail_input.get()
            my_password = pass_input.get()
            if from_mail == "" or my_password == "":
                messagebox.showwarning(title="Пустые поля", message="Заполните поля и не оставляйте их пустыми.")
            else:
                message = f"Subject: Поздравляю с днём рождения, {b_date_list['name'][md]}!\n\n{text}"
                with smtplib.SMTP("smtp.gmail.com", port=587) as connection:
                    connection.starttls()
                    connection.login(user=from_mail, password=my_password)
                    connection.sendmail(
                         from_addr= from_mail,
                         to_addrs= receiver_mail,
                         msg=message)
                winsound.PlaySound("email.wav", winsound.SND_ASYNC)
                messagebox.showinfo(title = "Письмо отправлено", message = f"Поздравительное письмо отправлено получателю:\n"
                                                                           f"Имя получателя: {b_date_list['name'][md]}\n"
                                                                           f"Мэйл: {b_date_list['email'][md]}\n"
                                                                           f"День рождения: {b_date_list['year'][md]}-{b_date_list['month'][md]}-{b_date_list['day'][md]}\n")
        else:
            messagebox.showinfo(title = "Именинники не найдены", message = "Поздравительное письмо не было выслано, потому как "
                                                                           "сегодня ни один человек из Вашего списка не празднует ДР.")
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.05.2021, 23:53
Ответы с готовыми решениями:

Консоль закрывается в любом случае
while True: print("""Введите номер нужной Вам формулы 1) Формула Герона 2) Формула Пифагора 3) Площадь треугольника по высоте и...

Какие библиотеки стоит знать в любом случае
Здравствуйте, вопрос такой: на какие django модули не идущие из коробки стоит обратить внимание ? Например бытует мнение что...

Условие if выполняется в любом случае
Здравствуйте, у меня есть вот такой код: const int size = 20; int* arr = new int; srand(time(NULL)); //rand(); ...

5
5515 / 2868 / 571
Регистрация: 07.11.2019
Сообщений: 4,757
10.05.2021, 07:07
Вы же понимаете, что '05-09' не равно '5-9'?
1
 Аватар для Oxidous
4 / 4 / 1
Регистрация: 03.09.2014
Сообщений: 156
10.05.2021, 08:42  [ТС]
Я тоже думал, что либо сегодняшнее число, либо месяц и день из словаря могут иметь разный формат, но у них обоих одинаковый формат:

print(current_mmdd)
Текущий месяц и день из datetime: 5-10

print(f"{b_date_list['month'][md]}-{b_date_list['day'][md]}")
Месяц и день именинника из словаря: 5-10
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
10.05.2021, 09:00
Oxidous, а зачем использовать для сравнения какой-то дурацкий формат, вместо сравнения собсно объектов даты?
1
5515 / 2868 / 571
Регистрация: 07.11.2019
Сообщений: 4,757
10.05.2021, 09:20
Oxidous, тогда запустите отладчик поставьте точку останова и посмотрите что у вас не так работает.
1
 Аватар для Oxidous
4 / 4 / 1
Регистрация: 03.09.2014
Сообщений: 156
10.05.2021, 16:32  [ТС]
Спасибо, немного изменил код и представил форматы дат в виде кортежей - системный месяц и день, а так же из DataFrame создал словарь, где ключ - это кортеж, содержащий месяц и день, а значение - вся строка (инфо об имениннике).

Python
1
2
3
4
current_time = datetime.datetime.now()
    current_mmdd = (current_time.month, current_time.day)
    data = pandas.read_csv("birthdays.csv")
    birthdays_dict = {(data_row['month'], data_row['day']): data_row for (index, data_row) in data.iterrows()}
Теперь в условии текущий месяц и день ищутся в самом словаре. Если совпадение найдено, то выполняется нужная часть кода.

Python
1
if current_mmdd in birthdays_dict:
Теперь всё заработало как нужно. Если именинник есть, то высылает письмо, если нет, то юзеру выводится инфо-окно с сообщением.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.05.2021, 16:32
Помогаю со студенческими работами здесь

Условие не соблюдается. выводит if в любом случае
вот код. что я делаю не так? на условие не обращайте внимания, я только учусь. суть в том, что он в любом случае пишет "вы ввели...

Загрузка ЦП на 100% (в любом случае)
Как только включаю пк, гудит и на диспетчере задач цп на 100%, и так все время работы пк. Процессор всегда загружен на 100%, даже когда...

Функция срабатывающая в любом случае
Доброе время суток! У меня есть xxx.dll, которая состоит из нескольких классов. Эта xxx.dll используется в нескольких программах. В...

Как в любом случае закрыть COM port
Уважаемые форумчане у меня возникли сложности при написании программы для работы с 2-мя портами (com), c такими настройками ...

Сохранять вводимый пароль в любом случае
Подскажите как сделать так что бы, когда у меня на компьютере входят в соц.сеть вводя логин и пороль, так вот я хочу узнать если способ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru