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

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

09.05.2021, 23:53. Показов 778. Ответов 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,758
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,758
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
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
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
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru