Задать вопрос
Ответы пользователя по тегу Python
  • Sqlite3 операционная ошибка, как исправить?

    Vindicar
    @Vindicar
    RTFM!
    c.execute(f"SELECT * from banking_application WHERE name_p IS {pop}")

    За такое бьют линейкой по пальцам. Собственно, ты уже наткнулся на одну из причин почему. Вторая тут.
    Ну и да, IS используется только как IS NULL или IS NOT NULL. Надо вот так:
    c.execute("SELECT * from banking_application WHERE name_p = ?", pop)
    Ответ написан
  • Как обратится к функции вне handler?

    Vindicar
    @Vindicar
    RTFM!
    global resault_func
    resault_func = fi(fil)

    Примерно так и обращайся.
    Ответ написан
    1 комментарий
  • Как корректно разобрать последовательность байт из COM-порта в python?

    Vindicar
    @Vindicar
    RTFM!
    Но почему каша в serial, и как его ответ сделать только bytes без исключения, требует размышления и осознания. Ведь переменная a - это bytes, и binascii.hexlify(a) это тоже bytes...

    Потому что никакой каши нет. Ответ уже только bytes.
    Просто когда выкидывашеь их в консоль, питон (точнее, метод __str__() класса bytes) пытается их представить "как можно читабельнее", т.е. пробует декодировать как ascii-строку что получится, а что не получится, представляет escape-последовательностями \x??.
    Доказать легко:
    b1 = bytes([1,2,3])
    print(b1)  # b'\x01\x02\x03'
    # начиная с Python 3.8 можно указать разделитель в методе hex()
    print(b1.hex(' ')) # 01 02 03
    
    b2 = bytes([0x57, 0x54, 0x46])
    print(b2)  # b'WTF'
    print(b2.hex(' ')) # 57 54 46

    Как видим, работает идентично
    Ответ написан
    Комментировать
  • Как добавлять произвольные данные в extra в logging python?

    Vindicar
    @Vindicar
    RTFM!
    Чем не устраивает вариант с непосредственной подстановкой данных в строку?
    logger.info("New log data: param1 = %s, param2 = %s", value1, value2)

    Просто если у тебя так много разных вариантов подставляемых данных, то проще это решать на уровне отдельного обращения к логгеру.
    Ответ написан
  • Почему не работает replace в python, json?

    Vindicar
    @Vindicar
    RTFM!
    akitaino = input
    Ты не вызываешь функцию input(), чтобы ввести строку с клавиатуры.
    Ты помещаешь ссылку на функцию input() в переменную akitaino.
    Что-то мне подсказывает, что ты не этого хотел.
    Ответ написан
  • Можно ли написать OS на Python?

    Vindicar
    @Vindicar
    RTFM!
    Нет.
    Ответ написан
    Комментировать
  • Как исправить ошибку в sqlite3?

    Vindicar
    @Vindicar
    RTFM!
    PyCharm выдает ошибку No data sources are configured to run this SQL and provide advanced code assistance. Disable this inspection via problem menu

    Это настройка Pycharm. Можно проигнорировать, скорее всего, или отключить в настройках анализа кода Pycharm.
    Но таблицу он создал и не дает ничего сделать с ней

    А как определил, что не даёт ничего сделать?
    Ответ написан
  • Что нужно написать в 'b', чтобы не произошло экранирование 'a'?

    Vindicar
    @Vindicar
    RTFM!
    Я бы использовал b = repr(a).
    Если нужно убрать кавычки - b = repr(a)[1:-1]
    Ответ написан
    Комментировать
  • Бьет ошибку в линии 11,в чем проблема?

    Vindicar
    @Vindicar
    RTFM!
    @bot.message_handler(commands=['start'])
    def start(message):
         markup = types.ReplyKeyboardMarkup(resize_keyboard= True,)
    item1 = types.KeyboardButton('Клик')
    markup.add(item1)
    bot.send_message(message.chat.id, f'Привет, {message.from_user. first_name}!', reply_markup=markup)

    Всё, что после markup = ..., уже не является частью функции startup(), так как отступ неверный. Учи Питон.
    Ответ написан
    Комментировать
  • Запутался в блоках if и циклах. Как исправить?

    Vindicar
    @Vindicar
    RTFM!
    У тебя только один цикл - повторять попытки ввода номера клетки, пока пользователь что-то не введёт. Больше он ничего не делает.
    Тебе нужен ещё один, который охватывает всю логику хода. Можешь сделать его вечным, и выходить из цикла по break, когда пользователь выиграет/проиграет.

    И да...
    locals()[numb + str(bomb_meaning)]
    Освой списки. Вот прямо сейчас отложи игру и освой списки.
    Ответ написан
    Комментировать
  • Цикл для обработчика кнопок?

    Vindicar
    @Vindicar
    RTFM!
    def handle_button(call_data: str):
            try:
                fileid = int(call_data) - 1  # определяем id файла по значению call_data
            except ValueError:
                return
            markup = InlineKeyboardMarkup()
            bttn_contact = (InlineKeyboardButton(text = " Связаться с менеджером", callback_data = "contact")) 
            markup.add(bttn_contact)
            bttn_home = (InlineKeyboardButton(text = " Начало", callback_data = "home"))
            markup.add(bttn_home)
            with open(f'data/{fileid}_info.txt', 'r', encoding = "utf-8") as file:
               content = file.read()
            # if тут не нужен, сработает и без него.
            for x in range(0, len(content), 4095):
                bot.send_message(call.message.chat.id,content[x:x+4095],reply_markup=markup)

    Ну а в обработчике просто дергаешь handle_button(call.data).
    Ответ написан
    Комментировать
  • Как решить эту задачу на python?

    Vindicar
    @Vindicar
    RTFM!
    Первая задача решается легко и непринуждённо.
    Рассмотри каждую кривую по отдельности, и реши, должна ли точка в искомой области лежать НАД кривой (y > f(x)) или ПОД кривой (y < f(x)). Объедини полученные условия операторами and.
    Ответ написан
    Комментировать
  • Чем отличаются условные операторы в Python?

    Vindicar
    @Vindicar
    RTFM!
    Поведение кода НЕ одинаковое.
    Если ты ввёл неправильное число, то первый код только выведет "конец игры", тогда как второй напишет "не угадал", а потом "конец игры". Что требуется по условию задачи - тебе виднее.

    А вообще я бы сказал, что правильно сделать иначе. У тебя два if подряд с противположными условиями - тут просится if-else.
    fathers_number = 5
    sons_number = int(input("Какое число я загадал? "))
    if sons_number == fathers_number:
        print("Угадал!")
    else:
        print("Не угадал!")
    
    print("Конец игры")
    Ответ написан
    1 комментарий
  • Как исправить "RuntimeError: There is no current event loop in thread"?

    Vindicar
    @Vindicar
    RTFM!
    Очевидно, webdriver использует под капотом asyncio, который требует дополнительных телодвижений при работе с потоками.
    В частности, нужно в начале потока сначала вызвать asyncio.new_event_loop(), потом её результат скинуть в asyncio.set_event_loop(). Доки.
    Ответ написан
  • Почему генератор yield начинает работу с последней страницы сайта?

    Vindicar
    @Vindicar
    RTFM!
    data = soup.find_all('div', class_= 'col-lg-4 col-md-6 mb-4')

    Ты перезаписываешь data на каждой итерации цикла, конечно там остаётся только последнее записанное значение. Совмести оба цикла внутри get_url() в один, иначе нет особого смысла в yield.
    Ответ написан
    Комментировать
  • Как парсить текст при помощи python-docx?

    Vindicar
    @Vindicar
    RTFM!
    1. Оформленный код в студию.
    2. Формат разбираемого текста фиксирован, т.е. он всегда выглядит одинаково? Если да, регулярные выражения в помощь.
    Если нет... ну можешь попробовать задействовать пакет Natasha, но это из пушки по воробьям.
    Ответ написан
  • Как записать данные в столбик в csv формате?

    Vindicar
    @Vindicar
    RTFM!
    file_writer.writerow([name, subscribers, type, price])

    Ну так ты просишь записать в одну строку, он и записывает в одну строку.
    file_writer.writerows(zip(name, subscribers, type, price))


    zip() превратит отдельные списки ([имя, имя, ...], [подписчики, подписчики, ...], [тип, тип, ...], [цена, цена, ...]) в последовательность значений ([имя, подписчики, тип, цена], [имя, подписчики, тип, цена], ...)
    Ответ написан
    1 комментарий
  • Как сделать так, чтобы бот телеграмм пересылал данные, которые ввел пользователь в другой аккаунт?

    Vindicar
    @Vindicar
    RTFM!
    Смотри в сторону Finite State Machine.
    Если коротко, твой бот должен для каждого пользователя помнить, на каком этапе он находится, и обрабатывать события соответственно.
    "Я получил сообщение от Васи. Вася сейчас на этапе ввода имени. Значит, нужно записать текст сообщения как имя, попросить ввести номер, и перевести Васю на этап ввода номера."
    Многие библиотеки для чатботов уже имеют ту или иную реализацию FSM, как раз для реализации таких вот сценариев. Читай документацию на ту библиотеку, которую ты собираешься использовать.
    Если у неё этого нет, или эта реализация тебе почему-то не подходит, то можно попробовать наколхозить её самому. Как я уже говорил, всё, что реально нужно - для каждого пользователя помнить, на каком этапе он находится.
    Ответ написан
    Комментировать
  • Как правильно одновременно запустить двух Telegram ботов одной программой на Python?

    Vindicar
    @Vindicar
    RTFM!
    Ну потому что ты фигню написал.
    th_bot = Thread(target=pyrobot(), args=())
    th_userbot = Thread(target=aiobot(), args=())

    Ты пытаешься запустить в качестве потока значение, возвращаемое функцией pyrobot(). А так как она уходит в цикл и значения не возвращает, то далее ничего не происходит. До вызова конструктора Thread() дело не доходит. С aiobot() аналогично.

    Еще раз:
    pyrobot() - вызов функции
    pyrobot - ссылка на функцию

    EDIT:
    Оба бота - асинхронные на базе asyncio, им для работы нужен цикл-реактор (event loop). Вообще не факт, что хорошая идея запускать их в потоках.
    Тут есть два варианта, сразу даже не скажу, что проще.
    Вариант А, лобовой: каждый бот создаёт своё собственные реактор через asyncio.new_event_loop(), потом задаёт его как текущий для своего потока через asyncio.set_event_loop(loop). Если ботам не требуется взаимодействовать, то это может быть проще. Если требуется... будут проблемы. Два реактора в одной программе - это не хорошо.

    Вариант Б, адекватный:
    И вызов app.run(), и вызов executor.start_polling(dp, skip_updates=True) скорее всего под капотом создают асинхронную функцию (корутину), и запускают её в реакторе. Тогда ты можешь обойтись без потоков, заставив обоих ботов работать на одном реакторе. Нужно будет зарыться в доки, или даже глянуть исходники.

    Например, для пирограмма написано такое:
    When calling this method (app.run()) without any argument it acts as a convenience method that calls start(), idle() and stop() in sequence. It makes running a single client less verbose.

    Т.е. вместо вызова app.run() ты можешь изменить код так:
    async def pyrobot():  # обрати внимание, теперь функция асинхронная!
        print("pyro started")
        @app.on_message(filters.chat("some_chat"))
        async def print_pyrogram():
            print("Pyrogram")
        # это вместо вызова app.run(), как написано в доках.
        await app.start()
        try:
            await app.idle()
        finally:
            await app.end()

    Затем делаешь аналогичный трюк с aiobot(). Нужно посмотреть в доках на аиограм, как именно.

    И потом запускаешь обоих ботов кодом вида...
    asyncio.run(asyncio.gather(pyrobot(), aiobot()))
    Ответ написан
    3 комментария