Ответы пользователя по тегу Python
  • Ограничение ввода данных в переменную?

    @o5a
    Проверку нужно до перевода в число делать, плюс добавить проверку на само число (или отсутствие букв, по желанию)
    async def process_start_command(message: types.Message):
        number1 = message.text.split()[1]
        if not (number1.isdigit() and 1 <= int(number1) <= 1000):
        	await message.answer(f'введите число меньше 1000')
        else:
            random_number = random.randint(0, int(number1))

    И кстати random.randint(0, x) выдаст число из x+1 набора чисел, а не x.
    Ответ написан
  • Как убрать дату из столбца?

    @o5a
    Это поле не даты, а диапазона даты (Timedelta), потому что получали его, вычитая 2 даты. У него нет "просто времени". Чтобы взять от него только время, нужно сначала привести к типу даты. Например так (добавляем к сегодняшнему числу этот диапазон времени), тогда уже можно отобразить отдельно время без даты:
    (pd.Timestamp('today').normalize()+severstal_df['duration']).dt.time
    Ответ написан
    5 комментариев
  • Как сделать проверку запрещённых и разрешённых слов?

    @o5a
    Я так и не понял, нужны ли именно регулярные выражения. Если в списках просто ссылки, а не шаблоны ссылок, то можно и простым link in text вместо регулярных выражений :
    # blacklist, whitelist соответственно список запрещенных и разрешенных
    def check(text):
        if any(link in text for link in blacklist):
            return False
        elif any(link in text for link in whitelist):
            return True
        return False

    Если же нужны именно регулярные выражения, можно их объединить для вида 'link1|link2|link3', может быть быстрее при большом количестве ссылок, например так:
    def check(text):
        if re.search('|'.join(map(re.escape, blacklist)), text):
            return False
        elif re.search('|'.join(map(re.escape, whitelist)), text):
            return True
        return False
    Ответ написан
    4 комментария
  • Дает кучу ошибок при написании бота на Python. Что делать?

    @o5a
    Параметры (команды, типы) в хэндлере нужно указывать списком:
    @bot.message_handler(commands=['start'])
    Ответ написан
    3 комментария
  • Ошибка AttributeError: 'NoneType' object has no attribute 'from_user', как исправить?

    @o5a
    Так и проверяйте в условии, что ответ
    if message.reply_to_message:
        bot.send_message(message.chat.id, ~f'@{message.from_user.username} Обнял @{message.reply_to_message.from_user.username}')
    Ответ написан
    2 комментария
  • Telegram bot. Как можно считать информацию введённую пользователем?

    @o5a
    register_next_step_handler поддерживает указание дополнительных параметров вызова функции:
    bot.register_next_step_handler(msg, getweather, city_name)

    Соответственно надо будет изменить саму getweather, чтобы понимала этот параметр
    Ответ написан
    Комментировать
  • Программа выдает ошибку "NoneType' object has no attribute 'get_weather' ", как исправить код?

    @o5a
    Это какой-то старый синтаксис. Сейчас делается так:
    owm = pyowm.OWM('КЛЮЧ')
    mgr = owm.weather_manager()
    observation = mgr.weather_at_place(city)
    w = observation.weather
    temperature = w.temperature('celsius')['temp']
    Ответ написан
    Комментировать
  • Ошибка: SyntaxError: positional argument follows keyword argument как исправить?

    @o5a
    После именованных (chat_id= ) аргументов уже нельзя использовать позиционные (без указания имени аргумента). Т.е. или все передавать без имени, или явно указывать название второго аргумента.
    Ответ написан
    Комментировать
  • Проблема с Telebot Python Sqlite3?

    @o5a
    Потому что текстовые строки складываются не так, как числа.
    sql.execute("UPDATE users SET name = name || '\n' || ? WHERE login = ?", (name_for_table, message.from_user.id))

    А для чего вообще это добавление на новой строке понадобилось?
    Ответ написан
    Комментировать
  • Как сделать бесконечную стрельбу в pygame?

    @o5a
    Проблема в том, что событие нажатия на кнопку срабатывает только в момент нажатия. Так что если просто держать пробел, то в каждом последующем цикле событие нажатия не срабатывает, но флаг fire сбрасывается в False каждый цикл, поэтому стрельба останавливается.
    Можно флаг fire привязать к самому кораблю как аттрибут, т.е. в __init__
    self.fire = False
    И в событиях работать именно с атрибутом класса, а не передавать отдельную переменную fire.
    def check_keydown_events(event, ship, settings, screen, bullets):
        if event.key == pygame.K_LEFT:
            # left arrow keydown events
            ship.move_left = True  # moves ship left when key's keeping pressed
        if event.key == pygame.K_RIGHT:
            # right arrow keydown events
            ship.move_right = True  # moves ship right when key's keeping pressed
        if event.key == pygame.K_DOWN:
            # down arrow keydown events
            ship.move_down = True  # moves ship down when key's keeping pressed
        if event.key == pygame.K_UP:
            # up arrow keydown events
            ship.move_up = True  # moves ship up when key's keeping pressed
        if event.key == pygame.K_SPACE:
            ship.fire = True

    Аналогично изменить в функции отпускания кнопки.
    Но т.к. событие нажатия не срабатывает повторно каждый цикл, то и само создание новых пуль не будет работать в той функции, так что ее нужно перенести туда, где срабатывает каждый цикл, например в тот же check_events
    def check_events(ship, settings, screen, bullets):
        """main event checker function"""
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                # working on keydown events
                check_keydown_events(event, ship, settings, screen, bullets)
                # function that checks keydown event type and works according event type
            elif event.type == pygame.KEYUP:
                check_keyup_events(event, ship)
                # function that checks keyup event type and works according event type
        print(len(bullets))  # to check amount of bullets on screen
        if ship.fire and len(bullets) < settings.bullets_allowed:
            # continues firing until amount of bullets reaches limit
            new_bullet = Bullet(settings, ship, screen)  # creating new bullet
            bullets.add(new_bullet)  # adding created bullet to Group
    Ответ написан
    3 комментария
  • Как склеить csv файлы?

    @o5a
    wowilon, чтобы этот код работал, файлы должны быть однотипные, с одинаковым количеством столбцов. В коде ошибки он как раз и указывает, что в одних файлах 2 столбца, в других 3.
    Если уверены, что файлы одинаковой структуры, можете проверить соответствие разделителя столбцов. В библиотеках для работы csv и pandas в том числе по умолчанию используется запятая, в то время как в русской локали по умолчанию используется точка с запятой. Если в ваших csv точка с запятой, то надо явно указать в параметре:
    combined_csv = pd.concat([pd.read_csv(f, sep=";") for f in all_filenames ])
    Ответ написан
    Комментировать
  • Не меняется размер текста в Pillow, что делать?

    @o5a
    font = headline
    Ответ написан
    Комментировать
  • Как обработать нажатие кнопки во время работы цикла?

    @o5a
    Не надо использовать свои циклы, чтобы не вызывать конфликт с циклом tkinter. Для запуска по времени есть root.after(время в мс, функция), через нее же можно и цикл сделать.
    def something():
        if check != 0:
            # какие-то вычисления
            root.after(1000, something)
    
    # для запуска самого цикла из основного кода программы
    root.after(0, something)
    Ответ написан
    Комментировать
  • Как записать разные типы данных с помощью Python в таблицу SQL?

    @o5a
    Это делается через подстановку значений
    insert_query = """ INSERT INTO postgreetest_db (t1, t2, t3, t4, t5, t6, t7) VALUES (%s, %s, %s, %s, %s, %s, %s)"""
    cursor.execute(insert_query, resultat)
    Ответ написан
    7 комментариев
  • Как мне отправить все картинки из папки через бота на питоне?

    @o5a
    Потому что в msg.photo содержится не одно, а список вариантов с разными разрешениями. Так что сначала нужно выбрать нужное. Например так
    photo = max(msg.photo, key=lambda x: x.height)
    file_id = photo.file_id

    P.S. хотя я упустил, что ругается на 'NoneType', т.е. информации о фото вообще нет (msg.photo = None), причина еще в чем-то
    Ответ написан
  • Почему горячая клавиша не привязывается к методу?

    @o5a
    Нажатие модификаторов по-другому определяется, через event.state
    ctrl  = (event.state & 4) != 0 # признак нажатия Ctrl
    Ответ написан
    2 комментария
  • Как удалить экземпляр класса?

    @o5a
    Если речь про то, чтобы при нажатии удалять кнопки, то нужно использовать метод destroy()
    Но для этого где-то нужно сохранять эти созданные в init кнопки, сейчас они никуда не привязаны.
    Например
    self.bt = Button(root, text="gg", command=self.a)
    # и потом для удаления можно будет сделать
    self.bt.destroy()

    Или же унаследовать этот класс кнопки, чтобы сам объект был кнопкой
    class But(Button):
        def __init__(self,root,coords):
            super().__init__(root, text="gg", command=self.a)
            self.grid(row=1, column=coords)
        def a(self):
            print("bt")
            self.destroy()
    Ответ написан
  • Как найти пользователя в БД Sqlite3 Python?

    @o5a
    Почитайте основы SQL (например https://proglib.io/p/sql-for-20-minutes)

    Для получения информации там есть своя система фильтров. В данном случае просто
    cur.execute("SELECT * FROM users WHERE id = ?", (id, ))
    all = cur.fetchone()

    в all будет запись с этим пользователем, если есть, или None, если отсутствует.
    или так
    cur.execute("SELECT COUNT(*) FROM users WHERE id = ?", (id, ))
    cnt = cur.fetchone()[0]
    в cnt будет кол-во записей с этим пользователем, т.е. 1 если есть, 0 если нет.
    Ответ написан
    Комментировать
  • Что изучить чтобы переписать часть библиотеки ecdsa в python3?

    @o5a
    Найти в исходных кодах библиотеки начальные элементы, в данном случае
    SigningKey и SECP256k1 и взять их код, и всего, что еще они будут использовать.
    Насколько вижу 1-й это класс из keys.py, 2-й - объект класса Curve из curves.py
    Ответ написан
    2 комментария
  • Python CSV Upgrade?

    @o5a
    Не нужно выдумывать "обновление" содержимого файла, так не работает. Для замены значения в CSV полностью его считываете во вложенный список/словарь, находите нужную строку (по id или еще чему нужно), заменяете в значение в этом списке. И уже после этого полностью перезаписываете файл этим новым списком. Т.е. условно
    data = get_all()
    затем аналогично get_by_id() ищем нужную запись в этом массиве и заменяем ее на новую, получаем обновленный вложенный список data
    обновленный массив записываем назад в файл: write(data)

    Для работы с CSV вместо ручного разбиения по символам есть родная библиотека csv, там есть уже более специализированные методы (с выбором различных параметров: символ разделителя, экранирование кавычек и т.п.)
    Ответ написан
    Комментировать