Форум сайта python.su
1
Спасибо за развернутый ответ.
py.user.nextНе подскажешь какую лучше roadmap выбрать по изучению python?
Так что снимай розовые очки и начинай с нуля.
Отредактировано joneb1983 (Ноя. 22, 2022 09:57:24)
Офлайн
857
Для ознакомления с основами программирования можешь пройти курс Хирьянова. Он типа православный человек, учился на священника или дьякона, поэтому всё делает бесплатно для людей. Он даёт несколько языков, но даёт лишь основы, потому что, видимо, сам не шарит глубоко. Нет у него глубоких курсов, только курс для первокурсников и курс для школьников. Но по крайней мере это абсолютно бесплатно и трушно.
Главным образом, он там рассказывает, что программирование - это не питон, а питон - это лишь инструмент для программирования. Как рисование - это не кисточка, а кисточка - это лишь инструмент для рисования. Нарисовать картину кисточкой не получится, если ты кисточку изучил хорошо. Для рисования надо изучать изобразительное искусство и его теорию, а кисточка потом применяется или карандаш, - совсем не важно. Правила рисования для всех инструментов одинаковы. Питон - это кисточка.
joneb1983А как ты его проверишь? Давать-то он всё равно будет максимум начальные знания какие-то, которые и бесплатно можно взять самому. Но может быть и хуже, он может начать тебе втирать, что ты суперпрограммист уже, что у тебя успехи какие-то, при этом делать это на пустом месте. Не бывает быстрого обучения. А проверить себя всегда можно: ты просто берёшь и пробуешь написать программу. Если не получается, значит ты не умеешь.
Ментора если найти частного
Отредактировано py.user.next (Ноя. 22, 2022 11:45:51)
Офлайн
124
import smtplib from email.message import EmailMessage def get_to_addr_from_excel(file): print('достает адрес из файла') def get_to_copy_addr_from_excel(file): print('достает адрес для копии из файла') def create_subject(num, addr): print('создает тему для сообщения') def create_text_message(num): print('создает текст сообщения') def get_data_from_table(): print('достает данные из таблицы') def get_chart(): print('достает график') def get_device_info(): print('получает информацию от оборудования') def send_email_message(to, subject, text, cc=None): with smtplib.SMTP('smtp.rambler.ru', 587) as server: try: server.starttls() server.login('your_addr@mail', 'passwd') msg = EmailMessage() msg['Subject'] = subject msg['From'] = 'your_addr@mail' msg['To'] = to if cc: msg['CC'] = cc msg.set_content(text) errors = server.send_message(msg) return errors except smtplib.SMTPException as e: return e if __name__ == '__main__': res = send_email_message('to_adddr@mail', 'тема', 'отправлено из python','addr_for_copy@mail' ) if res: print(res)
Офлайн
1
py.user.nextПривет. Посидел немного и решил вникнуть в конструкцию языка и необходимую мне программу. Получилось создать код с использованием базы данных, скомпилировать в .exe файл. Программа работает.
Так что снимай розовые очки и начинай с нуля.
import os
import win32com.client as win32
import sqlite3
def main():
#---------------------------------------------------------------------------------------------------------------------------------------------------------
#Приветствие и информация о программе
print('Вас приветствует программа Auto create letter outlook (ACLO)\n****************************************************************') #Вывод Текста
print('Программа автоматически формирует письмо перед отправкой по недоступным каналам связи.\nАвтоматически подставляет адреса, тему письма, текст и данные из БД.') #Вывод Текста
print('*******************************************************************************') #Вывод Текста
#---------------------------------------------------------------------------------------------------------------------------------------------------------
#Объявление переменных их переназначение и ввод значений от пользователя через input
channel_0 = input('Введите № канала (Пример: 053)\n*******************************\n')#Ввод значения в переменную channel_0
channel = str("'"+ channel_0 + "'")#Переназначение переменной channel_0 в channel
channel_2 = str(""+ channel_0 + "")#Переназначение переменной channel_0 в channel_2
#Переназначение делались для того чтобы значения были с ковычками, это необходимо для сравнивания со значениями в базе данных,
#так как там все значения в ячейках представлены в кавычках 'TEXT'
service = input('Введите номер Сервиса (1 - VPLAN 2 - Internet)\n************************************************\n')#Ввод значения в переменную service
ch_2 = 'no chanell'#Обьявление значения переменной для последующего сравнения в условиях
division =''#Обьявление пустого значения переменной, переменная будет использоваться для подставления в поле копия нужного адреса по условию ниже
adrr_3 ='no'#Обьявление значения переменной для последующего сравнения в условиях, далее в эту переменную будет перезаписываться вывод из базы данных из столбца channels_addr
#---------------------------------------------------------------------------------------------------------------------------------------------------------
#Условие записывается в переменную для дальнейшего сравнения в следующих условиях
service_2 = ''#Обьявление пустого значения переменной для сравнения в таблице channels
if service == '1':#Условие для сравнивания в таблице channels
service_2 = str("'VP LAN'")
else:
service_2 = str("'Internet'")
#---------------------------------------------------------------------------------------------------------------------------------------------------------
#Подключение к базе и запись данных из таблицы БД в переменную
title = sqlite3.connect('channels_071222.db')#База данных подключение
title_2 = title.cursor()#Функция title.cursor() записывается в переменную title2
title_2.execute('SELECT channels_title FROM channels WHERE channels_ch == '+channel+'')#Вывод данных только из столбца channels_addr таблицы channels
#где есть условие WHERE, где сравнивается введеные даные пользователя в переменной channel с данными столбца channels_ch
title_f = title_2.fetchall()#В переменую title_f устанавливается функция fetchall() которая возвращает только одну строку
for row in title_f:#Цикл for для перебора последовательности строк
title_r = (row)#Запись в переменную title_r
title_ch = (' '.join(title_r))#Запись в переменную title_ch для удаление кавычек и скобок
#---------------------------------------------------------------------------------------------------------------------------------------------------------
#Подключение к базе и запись данных из таблицы БД в переменную
consq = sqlite3.connect('channels_071222.db')#База данных подключение
cursorrObjq = consq.cursor()#Функция consq.cursor() записывается в переменную cursorrObjq
cursorrObjq.execute('SELECT channels_addr FROM channels WHERE channels_ch == '+channel+' AND channels_ser == '+service_2+'')#Вывод данных только из столбца channels_addr таблицы channels
#где есть условие WHERE, где сравнивается введеные даные пользователя в переменной channel с данными столбца channels_ch и значением столбца channels_ser с переменной service_2
rowssq = cursorrObjq.fetchall()#В переменую rowssq устанавливается функция fetchall() которая возвращает только одну строку
for row in rowssq:#Цикл for для перебора последовательности строк
adrr_2 = (row)#Запись в переменную adrr_2
adrr_3 = (' '.join(adrr_2))#Запись в переменную adrr_3 для удаление кавычек и скобок
#---------------------------------------------------------------------------------------------------------------------------------------------------------
#Условия при которых переменная division будет меняться в копии отправителей в письме
if channel_0 == '078' or '067':
division = 'www@mail.ru'
if channel_0 == '077':
division = 'eee@mail.ru'
if channel_0 == '076':
division = 'eee@mail.ru'
if channel_0 == '075':
division = 'eee@mail.ru'
if channel_0 == '074':
division = 'eee@mail.ru'
if channel_0 == '073':
division = 'eee@mail.ru'
if channel_0 == '072':
division = 'eee@mail.ru'
if channel_0 == '071':
division = 'eee@mail.ru'
#---------------------------------------------------------------------------------------------------------------------------------------------------------
#Подключение к базе и запись данных из таблицы БД в переменную
cons = sqlite3.connect('channels_071222.db')#База данных подключение
cursorrObj = cons.cursor()#Функция cons.cursor() записывается в переменную cursorObj
cursorrObj.execute('SELECT channels_ch FROM channels WHERE channels_ch == '+channel+' ')#Вывод данных только из столбца channels_ср таблицы channels
#где есть условие WHERE, где сравнивается введеные даные пользователя в переменной channel с данными столбца channels_ch
rowss = cursorrObj.fetchall()#В переменую rowss устанавливается функция fetchall() которая возвращает только одну строку
for row in rowss:#Цикл for для перебора последовательности строк
ch_1 = (row)#Запись в переменную ch_1
ch_2 = (' '.join(ch_1))#Запись в переменную ch_2 для удаление кавычек и скобок
#---------------------------------------------------------------------------------------------------------------------------------------------------------
#---------------------------------------------------------------------------------------------------------------------------------------------------------
con = sqlite3.connect('channels_071222.db')#База данных подключение
cursorObj = con.cursor()#Функция con.cursor() записывается в переменную cursorObj
#Главное условие для VPLAN
if service == '1' and ch_2 != 'no chanell' and adrr_3 != 'no':#Условие для ранее введенного значения в переменной service, ch_2,adrr_3 для VPLAN
cursorObj.execute('SELECT channels_addr FROM channels WHERE channels_ser == "VP LAN" AND channels_ch == '+channel+' ')#Вывод данных только из столбца channels_addr таблицы channels
#где есть условие WHERE, где сравнивается введеные даные пользователя в переменной channel с данными столбца channels_ch и значением столбца channels_ser
rows = cursorObj.fetchall()#В переменую rows устанавливается функция fetchall() которая возвращает только одну строку
for row in rows:#Цикл for для перебора последовательности строк
address = (row)#Запись в переменную address
address2 = (' '.join(address))#Запись в переменную address2 для удаление кавычек и скобок
cursorObj.execute('SELECT channels_title, channels_ser, channels_oper, channels_id, channels_speed, channels_addr, channels_scala, channels_media, channels_ip, channels_note FROM channels WHERE channels_ser == "VP LAN" AND channels_ch == '+channel+' ')#Вывод данных всего столбца из таблицы channels
#,(кроме столбца channels_ch) где есть условие WHERE, где сравнивается введеные даные пользователя в переменной channel с данными столбца channels_ch и значением столбца channels_ser
rows_all = cursorObj.fetchall()#В переменую rows_all устанавливается функция fetchall() которая возвращает только одну строку
for row in rows_all:#Цикл for для перебора последовательности строк
row_table = (row)#Запись в переменную row_table
row_table2 = (' '.join(row_table))#Запись в переменную row_table2 значений без ковычек, скобочек и запятых
#---------------------------------------------------------------------------------------------------------------------------------------------------------
#В этом блоке происходит подключение к БД и вывод из таблицы название оператора связи при выборе определенных столбцов и запись этого результата в переменную title_ch_oper
title_oper = sqlite3.connect('channels_071222.db')#База данных подключение
title_2_oper = title_oper.cursor()#Функция con.cursor() записывается в переменную title_2_oper
title_2_oper.execute('SELECT channels_oper FROM channels WHERE channels_ch == '+channel+' AND channels_ser == '+service_2+'')#Вывод данных только из столбца channels_oper таблицы channels
#где есть условие WHERE, где сравнивается введеные даные пользователя в переменной channel с данными столбца channels_ch и значением столбца channels_ser
title_f_oper = title_2_oper.fetchall()#В переменую title_f_oper устанавливается функция fetchall() которая возвращает только одну строку
for row in title_f_oper:#Цикл for для перебора последовательности строк
title_r_oper = (row)#Запись в переменную title_r_oper
title_ch_oper = (' '.join(title_r_oper))#Запись в переменную title_ch_oper для удаление кавычек и скобок
#---------------------------------------------------------------------------------------------------------------------------------------------------------
#В этом блоке происходит подключение к Outlook.Application, создание и формирование эл.письма в приложении Outlook
olApp = win32.Dispatch('Outlook.Application')#Запись в переменную olApp обращения к Outlook
olNS = olApp.GetNameSpace('MAPI')#Запись в переменную olNS обращения к API Outlook
mailItem = olApp.CreateItem(0)#Создание эл. письма в приложении Outlook
mailItem.Subject = 'Недоступность канала связи VPLAN '+ str(title_ch_oper)+ ' в '+ str(title_ch) + ' по адресу '+ str(address2)+ ' //'#Тема письма с втавляемыми переменными
mailItem.BodyFormat = 1#Формат текста тела письма(0-Неопределенный, 1-Простой, 2-HTML, 3-Rich text)
mailItem.Body = 'Добрый день.\nКоллеги, фиксируем недоступность канала связи.\nПросьба взять в работу и уточнить причины\n\n' + str(row_table2)#Сам текст тела письма
if title_ch_oper == 'Билайн':
mailItem.To = 'beeline@mail.ru'#Адреса кому
elif title_ch_oper == 'RETN':
mailItem.To = 'retn@mail.ru'#Адреса кому
else:
mailItem.To = 'no adress'#Адреса кому
mailItem.CC = '111@mail.ru; 333@mail.ru;' + str(division)#Адреса копии
mailItem.Display()#Открыть и показать заполненое письмо перед отправкой в Outlook
#---------------------------------------------------------------------------------------------------------------------------------------------------------
#---------------------------------------------------------------------------------------------------------------------------------------------------------
#Главное условие для Internet
elif service == '2' and ch_2 != 'no chanell' and adrr_3 != 'no':#Условие для ранее введенного значения в переменной service, ch_2,adrr_3 для Internet
cursorObj.execute('SELECT channels_addr FROM channels WHERE channels_ser == "Internet" AND channels_ch == '+channel+' ')#Вывод данных только из столбца channels_addr таблицы channels
#где есть условие WHERE, где сравнивается введеные даные пользователя в переменной channel с данными столбца channels_ch
rows = cursorObj.fetchall()#В переменую rows устанавливается функция fetchall() которая возвращает только одну строку
for row in rows:#Цикл for для перебора последовательности строк
address = (row)#Запись в переменную address
address2 = (' '.join(address))#Запись в переменную address2 для удаление кавычек и скобок
cursorObj.execute('SELECT channels_title, channels_ser, channels_oper, channels_id, channels_speed, channels_addr, channels_scala, channels_media, channels_ip, channels_note FROM channels WHERE channels_ser == "Internet" AND channels_ch == '+channel+' ')#Вывод данных всего столбца из таблицы channels
#,(кроме столбца channels_ch) где есть условие WHERE, где сравнивается введеные даные пользователя в переменной channel с данными столбца channels_ch и значением столбца channels_ser
rows_all = cursorObj.fetchall()#В переменую rows_all устанавливается функция fetchall() которая возвращает только одну строку
for row in rows_all:#Цикл for для перебора последовательности строк
row_table = (row)#Запись в переменную row_table
row_table2 = (' '.join(row_table))#Запись в переменную row_table2 значений без ковычек, скобочек и запятых
#---------------------------------------------------------------------------------------------------------------------------------------------------------
#В этом блоке происходит подключение к БД и вывод из таблицы название оператора связи при выборе определенных столбцов и запись этого результата в переменную title_ch_oper
title_oper = sqlite3.connect('channels_071222.db')#База данных подключение
title_2_oper = title_oper.cursor()#Функция con.cursor() записывается в переменную cursorObj
title_2_oper.execute('SELECT channels_oper FROM channels WHERE channels_ch == '+channel+' AND channels_ser == '+service_2+'')#Вывод данных только из столбца channels_addr таблицы channels
#где есть условие WHERE, где сравнивается введеные даные пользователя в переменной channel с данными столбца channels_ch и значением столбца channels_ser с переменной service_2
title_f_oper = title_2_oper.fetchall()#В переменую title_f_oper устанавливается функция fetchall() которая возвращает только одну строку
for row in title_f_oper:#Цикл for для перебора последовательности строк
title_r_oper = (row)#Запись в переменную title_r_oper
title_ch_oper = (' '.join(title_r_oper))#Запись в переменную title_ch_oper для удаление кавычек и скобок
#---------------------------------------------------------------------------------------------------------------------------------------------------------
#В этом блоке происходит подключение к Outlook.Application, создание и формирование эл.письма в приложении Outlook
olApp = win32.Dispatch('Outlook.Application')
olNS = olApp.GetNameSpace('MAPI')
mailItem = olApp.CreateItem(0)
mailItem.Subject = 'Недоступность канала связи Интернет '+ str(title_ch_oper)+ ' в '+ str(title_ch) + ' по адресу '+ str(address2)+ ' //'
mailItem.BodyFormat = 1
mailItem.Body = 'Добрый день.\nКоллеги, фиксируем недоступность канала связи.\nПросьба взять в работу и уточнить причины\n\n' + str(row_table2)
if title_ch_oper == 'Ростелеком':
mailItem.To = 'rostelecom@mail.ru'#Адреса кому
elif title_ch_oper == 'Энфорта':
mailItem.To = 'enforta@mail.ru'#Адреса кому
elif title_ch_oper == 'RETN':
mailItem.To = 'retn@mail.ru'#Адреса кому
elif title_ch_oper == 'ЭР-Телеком':
mailItem.To = 'enforta@mail.ru'#Адреса кому
elif title_ch_oper == 'Билайн':
mailItem.To = 'beeline@mail.ru'#Адреса кому
else:
mailItem.To = 'no adress'#Адреса кому
mailItem.CC = '111@mail.ru; 333@mail.ru;' + str(division)
mailItem.Display()
#---------------------------------------------------------------------------------------------------------------------------------------------------------
#Конец главных условий
else:
print('Нет такого канала или сервиса, попробуйте еще раз!\n\n')
#-------------------------------------------------------------------------------------------------------------------------------------------------------------
#В этом блоке вызывается функция main() которая была объеденнина вся вышенаписанная программа. Далее эта функция вызывается в бесконечном цикле с условием продолжения
#или остановки программы
stop = ''
while True:
main()
stop = input("Для выхода нажмите 's' и ENTER для продолжения нажмите ENTER\n")
if stop == 's':
break
if stop == 'S':
break
else:
continue
#-------------------------------------------------------------------------------------------------------------------------------------------------------------
Отредактировано joneb1983 (Дек. 8, 2022 13:14:18)
Офлайн
857
joneb1983Поищи в антивирусах папку для исключений. Там просто в исключения добавляешь папку, которую антивирус не проверяет, а потом в эту папку кладёшь свои программы, которые нужно исключить из проверки. Типа такого. Оно во всех антивирусах есть.
Возник вопрос, после компиляции в винде файл стал определяться как троян.
joneb1983Главное, что ты её написал от и до. Вот её не было, была только пустота, и вот она из пустоты появилась и работает после этого, приносит какую-то пользу тебе. Раньше её не было, теперь она есть.
Посидел немного и решил вникнуть в конструкцию языка и необходимую мне программу.
joneb1983Важно получать плюсы от своей программы. Понимаешь, когда делаешь учебные программы, ты от них плюсов не получаешь. Ну, ты получаешь от них плюсы в виде опыта там, экспериментов всяких, новых мелких знаний деталей там каких-то, но ты эти плюсы не чувствуешь. Они есть, но их не видно. Другое дело, когда твоя программа работает, а ты чай пьёшь в это время, и ты чувствуешь, что раньше ты бы не пил этот чай, потому что программы раньше не было этой. И без тебя бы она не появилась бы никогда.
Программа работает.
Отредактировано py.user.next (Дек. 8, 2022 22:57:12)
Офлайн
857
Теперь по коду и обучению.
joneb1983Да конечно. Я сам такие же писал, когда начинал. Я и комментарии пробовал писать и над кодом, и под кодом, и в три строчки, и в десять строк, пробовал всякое. Потом смотрел во времени, какой от этого эффект. Так оно постепенно вырабатывается в оптимальное. Где-то потом нужно и десять строк записать, а где-то вообще ноль. Также изучал разные способы комментариев у других программистов в разных проектах. Просто берёшь чужие программы, ничего в них не понимаешь, но читаешь комментарии в них, чтобы чисто комментарии посмотреть. Читал тоже про комментарии разные материалы. Я бы тебе рассказал, как писать комментарии, если бы можно было это рассказать за одну секунду. Но это целая область. Как бы это не важно всё, но несмотря на это, там всё равно теории дофига всякой.
Конечно уверен что мой код возможно не оптимизирован как надо
Отредактировано py.user.next (Дек. 8, 2022 22:56:12)
Офлайн