Ответы пользователя по тегу Python
  • Как вывести все элементы массива, если len не помогает?

    Судя по всему, массив в твоём примере это список элементов класса Lesson, который содержит атрибуты day, start, end, room... Если да, то один из вариантов:
    lessons_list = [Lesson(day=datetime.date(2023, 11, 23), start=datetime.time(8, 0), end=datetime.time(8, 40), room='304 - физика (н)', number=1, subject='Геометрия', assignments=[]), Lesson(day=da
    tetime.date(2023, 11, 23), start=datetime.time(8, 50), end=datetime.time(9, 30), room='104 - информатика (н)', number=2, subject='Информатика', assignments=[Assignment(id=88616187,
     comment='', type='Домашнее задание', content='п. 23 - читать, решить задачу', mark=None, is_duty=False, deadline=datetime.date(2023, 11, 23)), Assignment(id=0, comment='', type='С
    амостоятельная работа', content='Практическая работа по теме "Дискретизация звуковой информации"', mark=3, is_duty=False, deadline=datetime.date(2023, 11, 23))]), Lesson(day=dateti
    me.date(2023, 11, 23), start=datetime.time(9, 40), end=datetime.time(10, 20), room='206 - биология (н)', number=3, subject='Русский язык', assignments=[]), Lesson(day=datetime.date
    (2023, 11, 23), start=datetime.time(10, 30), end=datetime.time(11, 10), room='310 - математика (н)', number=4, subject='Алгебра и начала математического анализа', assignments=[Assi
    gnment(id=0, comment='', type='Самостоятельная работа', content='Иррациональные уравнения. Основные методы решения иррациональных уравнений', mark=2, is_duty=False, deadline=dateti
    me.date(2023, 11, 23))]), Lesson(day=datetime.date(2023, 11, 23), start=datetime.time(11, 30), end=datetime.time(12, 10), room='304 - физика (н)', number=5, subject='Физика', assig
    nments=[]), Lesson(day=datetime.date(2023, 11, 23), start=datetime.time(12, 30), end=datetime.time(13, 10), room='103 - хореография (н)', number=6, subject='Иностранный язык', assi
    gnments=[]), Lesson(day=datetime.date(2023, 11, 23), start=datetime.time(13, 20), end=datetime.time(14, 0), room='209 - история (н)', number=7, subject='Индивидуальный проект', ass
    ignments=[]), Lesson(day=datetime.date(2023, 11, 23), start=datetime.time(14, 10), end=datetime.time(14, 50), room='304 - физика (н)', number=8, subject='Проект "Россия - мои горизонты"', assignments=[])]
    
    for lesson in lessons_list:
        print(lesson.subject)


    Если это просто текст и самого класса Lesson у тебя нет, то тебе нужно работать с этим массивом, как со строкой (ответ уже писали выше). Либо же самому написать класс с такими же полями)
    Ответ написан
    1 комментарий
  • Как сделать уведомление в Aiogram?

    https://docs.aiogram.dev/en/latest/telegram/types/...
    await bot.answer_callback_query(callback_query_id=cmd.id, text="Уведомление", show_alert=True)

    либо
    await callback_query.answer("Уведомление", show_alert=True)
    Ответ написан
    4 комментария
  • Как проверять что введен русский язык?

    Решил написать свой вариант такой функции, чтобы продемонстрировать её несовершенство. Вариант с флагом и только русскими буквами делать не стал, сделал с процентами. Третья проверка не проходит, тк русских букв слишком мало в соотношении с другими, хотя текст по сути русский. Но это скорее исключение, в целом такая функция имеет место быть, но лучше перестраховаться от разных вариантов.

    import string
    
    def is_russian(text):
        alpha = "абвгдеёжзиклмнопрстуфхцчшщъыьэюя"
        new_text = text.translate(str.maketrans('', '', string.punctuation)).lower().replace(' ', '')
        
        rulet = 0
        for letter in new_text:
            if letter in alpha:
                rulet += 1
         
        # Если больше или равно 70%       
        if rulet/len(new_text) >= 0.7:
            return(True)
        else:
            return(False)
        
    
    good_text = "Какой-то текст, со знаками препинания, конечно же, sorry!"
    bad_text = "Some english text, isn't russian."
    secret = "Люблю Gucci"
    
    print(is_russian(good_text)) #вернёт True
    print(is_russian(bad_text)) #вернёт False
    print(is_russian(secret)) #вернёт False
    Ответ написан
    4 комментария
  • Как разделить строку по последнему указанному символу?

    s = r"С:\User\Users\Programs\program.py"
    print(s[:s.rindex("\\")+1])


    Для получения "чистой" строки, чтобы обратный слэш не использовался как экранирующий символ, использовал r-строку. А уже для поиска последнего индекса методом .rindex() использовал два слэша: один экранирующий, второй видит программа.

    Вывод сделал обычным срезом от начала до индекса последнего слэша+1, чтобы путь отображался включая его.
    Ответ написан
  • Как извлечь информацию из сайта?

    description в твоём случае это всё ещё список объектов супа. К ним можно/нужно применить метод text, чтобы получить именно текстовую составляющую.

    import requests
    from bs4 import BeautifulSoup
    
    url = "http://www.swhl.ru/page/1018390"
    r = requests.get(url)
    
    soup = BeautifulSoup(r.content, "lxml")
    description = soup.find_all("div", class_="page-text")
    
    for element in description:
        print(element.text)
    Ответ написан
  • Как отделить числа от букв в списке?

    lst = ['4', '10', '4', 'A', 'T']
    new_lst=[]
    
    for element in lst:
        if element.isdigit():
            new_lst.append(int(element))
        else:
            new_lst.append(element)


    С заменой в текущем списке:
    lst = ['4', '10', '4', 'A', 'T']
    
    for i in range(len(lst)):
        if lst[i].isdigit():
            lst[i] = int(lst[i])
            
    print(lst)
    Ответ написан
    4 комментария
  • Как в экселе найти номер заказа и забрать из него состав заказа?

    Искать по номеру можно так и выводить, используя срез:
    orders = [[1, "first", "order"], [2, "second", "order"], [3, "third", "order"], [4, "fourth", "order"]]
    
    order = int(input("Введите номер заказа: "))
    for line in orders:
        if line[0] == order:
            print(*line[1:])


    Обратите внимание, что перед этим, лучше сделать преведение типа номера заказа в строку, тк у вас в некоторых номерах заказов буквенные значения. Тогда и код будет выглядеть немного иначе.

    orders = [["1", "first", "order"], ["2", "second", "order"], ["3", "third", "order"], ["4", "fourth", "order"]] #первый элемент - строка
    
    order = input("Введите номер заказа: ") #не int
    for line in orders:
        if str(line[0]) == order: #если не преобразовывать список, можно здесь
            print(*line[1:])
    Ответ написан
    Комментировать
  • Как сделать автоматический перезапуск программы на python?

    import random
    
    from random import randint
    
    a = randint(1,5)
    while True:
        b = int(input("Веедите число от одного до пяти!"))
        if b == a:
            print("Число верное!")
            break
        else:
            print("Число неверное!")


    На забудь обернуть input в функцию int, а то никогда введенное число не будет верным, тк исходно input принимает строковое значение.
    Ответ написан
    1 комментарий
  • Как найти min и max в массиве в списке?

    dict = {
        "a": [131, 531],
        "b": [842, 612],
         "c": [516, 19]
    }
    
    float_nums = []
    for value in dict.values():
        for num in value:
            float_nums.append(float(num))
            
    a = min(float_nums)
    b = max(float_nums)
    a_index = []
    b_index = []
    
    for key, values in dict.items():
        if a in values:
            a_index.append(key)
            a_index.append(values.index(a))
        if b in values:
            b_index.append(key)
            b_index.append(values.index(b))
            
    print(a, *a_index)
    print(b, *b_index)
    Ответ написан
    4 комментария
  • Как сделать бот в Телеграм без приставки bot на конце?

    1. Авторизоваться с аккаунта, который будет использоваться в качестве бота тут: https://my.telegram.org/

    2. Создать там "приложение" и получить API id, API hash.

    3. Написать бота на библиотеке, поддерживающей Telegram client API, например Pyrogram
    (я пользуюсь им) https://docs.pyrogram.org/ или Telethon https://docs.telethon.dev/en/stable/ .
    Ответ написан
    2 комментария
  • Как отделить дату от даты и сделать его прописью?

    from datetime import datetime #импортируем нужное
    
    created = ...   #дата регистрации, взятая откуда-то ранее
    you_with_us = (datetime.now() - regdate).strftime(%d)
    #вычитаем из нынешней даты дату регистрации, форматируем, оставляя только дни
    Ответ написан
    2 комментария
  • Ошибка в боте, который отправляет комментарии.Что делать?

    Во первых не светите свой ID и Hash на форумах, это как логин и пароль от аккаунта)

    Ошибка у вас из-за того, что в цикле переменная msg это и есть сообщение чата. Нужно сделать так:
    print(f”Пропускаем уже обработанное message _id={msg.id}”)


    Для отладки в следующий раз можете делать вывод переменной в консоль, чтобы понять какие там есть поля и как к ним обращаться.
    Ответ написан
    Комментировать
  • Pyrogram bot: как отправить фото по айди?

    EntireMusic
    @EntireMusic Автор вопроса
    (:
    Всем большое спасибо за подсказки, особенно User . Проблема была как раз в фильтре. Нужно было искать photo и photo.file_id.
    Универсальный вариант - скачивать и отправлять фото, т.к. пересылка не будет работать из закрытых чатов. Вот такую функцию по-быстрому сообразил для загрузки фото.
    async def dl_last_photo(target):    #передаём в функцию ID или Username чата
        async for msg in app.get_chat_history(target, limit = 50, offset_id = -1):    #ищем в истории с конца, обрабатываем 50 сообщений
            if msg.photo:    #если есть фото
                print(msg.photo.file_id)    #в консоль выводим ID - не обязательно
                await app.download_media(msg.photo) #скачиваем фото из сообщения в стандартный каталог (папка_бота/downloads)


    По аналогии можно фильтровать и другие типы файлов. Так же можно менять папку, куда скачивается файл. И если вы уверены, что чат открыт и разрешена пересылка - можно и сразу переслать фото по ID куда нужно.
    Ответ написан
    Комментировать
  • Пишу тг бота для отправки комментариев на pyrogram. Выдаёт ошибку,что делать?

    В такой каше сложно разобраться. Но если я правильно понимаю, ты пытаешься проверить несуществующий атрибут:
    Выдаёт ошибку: if (msg.from_user is None and msg.forward_from_chat.id == public.id):
    AttributeError: ‘NoneType’ object has no attribute ‘I’d’

    Из твоего кода:
    if (msg.from_user is None) # если сообщение не имеет автора
    # и это репост из паблика (проверка по id)


    Это так не работает. Если нет автора, то такого атрибута нет вообще, эта часть не работает. Вот тебе пример на Pyrogram как из сообщения вытащить ID.
    any_sender_id = message.from_user.id if message.from_user else message.sender_chat.id #вытаскиваем ID
    if any_sender_id == public.id: #проверяем что это нужный паблик
        #дальше твоя логика

    Если сообщение "from_user", значит принимает его ID. Иначе - принимает ID чата/канала.

    этот же код чуть понятнее:
    any_sender_id = None    #объявляем переменную для хранения ID
    if message.from_user:    #если у нас есть параметр from_user
        any_sender_id = message.from_user.id    #присваеваем ID юзера
    else:    #иначе
        any_sender_id = message.sender_chat.id    #присваеваем ID канала или чата
    
    if any_sender_id == public.id:    #проверяем что это нужный паблик
        #дальше твоя логика
    Ответ написан
    Комментировать
  • Как найти бота или чат по id в Telegram?

    Смотря какой библиотекой будешь пользоваться.
    Ответ написан
  • Telegram userbot на Telethon не редактирует пересланные сообщения. Как исправить?

    EntireMusic
    @EntireMusic Автор вопроса
    (:
    Проблема решена! Само собой как-то заработало, в коде ничего не менял.

    Возможно, это какой-то глюк с сессиями, если ты в ТГ с этого же аккаунта в данный момент. Хотя в консоли никаких ошибок небыло, когда тестировал.

    Сейчас функция работает и с текстом, и с пересланными сообщениями. Иногда долговато - несколько секунд (бота залил на Heroku).
    Ответ написан
  • Aiogram: как обработать только одно "сообщение" из message.content_group?

    EntireMusic
    @EntireMusic Автор вопроса
    (:
    ec4b39bd9159b4972c016d7384e84ee0.jpg
    Решение проблемы из разряда "зато работает":
    # к тому что есть добавил это
    from time import sleep
    # список, где будет храниться message.media_group_id
    check_mess = []
    
    @dp.channel_post_handler(content_types=['any'])
    async def auto_redactor(message: types.Message):
        
        text = message.text
        if isinstance(message.caption, str):
            caption = message.caption
        else:
            caption = ''
    
        if hasattr(message, 'text') and isinstance(text, str):
            await message.edit_text(f'{text}\n\nподпись к тексту',parse_mode="HTML")
    # добавил проверку, что media_group_id ещё не в списке
        elif hasattr(message, 'caption') and message.media_group_id not in check_mess:
    # добавляем в список наш media_group_id
            check_mess.append(message.media_group_id)
            await message.edit_caption(f'подпись к медиа',parse_mode="HTML")
    # чищу список после 5 сек ожидания, чтобы хендлер успел обработать все медиа
            sleep(5)
            check_mess.clear()
    Ответ написан
    Комментировать
  • Aiogram: Нет InlineKeyboardButton под постами с несколькими фото. В чём проблема?

    EntireMusic
    @EntireMusic Автор вопроса
    (:
    В общем, я сдался.
    Сегодня протестировал ручную отправку медиагруппы и оказалось, что для bot.send_media_group просто-напросто нет аргумента reply_markup, как и на уровне прикрепления фото. Поэтому, без костылей уж точно не получится написать код, где к группе медиа прикрепляется InlineKeyboardButton. А может и вовсе нет такой возможности.
    Ответ написан
    Комментировать