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

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

09.05.2021, 23:53. Показов 796. Ответов 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
5517 / 2870 / 571
Регистрация: 07.11.2019
Сообщений: 4,761
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
5517 / 2870 / 571
Регистрация: 07.11.2019
Сообщений: 4,761
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
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru