Задать вопрос
Ответы пользователя по тегу Python
  • Как правильно сделать вывод данных из sqlite3?

    Vindicar
    @Vindicar
    RTFM!
    Category ID пробелы в именах столбцов - не лучшая идея. У тебя точно толбец так называется? Если да, то оберни имя столбца в `бэктики` (обычно на клавише Ё).
    Ну и да, сдаётся мне, что 'call.data' не будет работать так, как ты это ожидаешь.
    Ответ написан
    Комментировать
  • Progress bar как вывести результат?

    Vindicar
    @Vindicar
    RTFM!
    Оставаясь в рамках стандартного терминала - никак.
    Под никсами для сложного интерфейса в терминале есть ncurses, под виндой придётся искать аналог.
    Я бы сказал, если нужно что-то сложнее print() - осваивай tkinter. Если написать программу с умом, то можно будет сделать гибридное приложение, которое будет показывать GUI при обычном запуске, и работать в консоли при запуске с параметрами. Это если такое требуется, конечно - я фз какой у тебя сценарий использования.

    UPD: есть вариант использовать для вывода прогрессбара stderr, а для вывода результатов stdout, но в терминале они всё равно перемешаются.
    Ответ написан
    Комментировать
  • Как исправить ошибку с регулярными выражениями?

    Vindicar
    @Vindicar
    RTFM!
    Ну так почитай основы.
    Во-первых, используй r-строки, чтобы не натыкаться на проблемы с символом \.
    Во-вторых, изучи зарезервированные символы регулярных выражений, а именно: ( ) [ ] ^ $ . ? * +. Если тебе нужен этот символ как просто символ, его надо экранировать! Т.е. если тебе нужно совпадение с символом ?, надо писать \?.
    В-третьих, для поиска символа из указанного набора используются квадратные скобки, т.е. [abc] совпадёт с одним символом из указанных: a, b или c. Для задания диапазона можно сделать так: [a-z]. Это зачастую короче.
    В-четвёртых, для поиска символа НЕ из указанного набора используется такой синтаксис: [^abc]
    В-пятых, есть заранее заданные наборы. Например, \w описывает словесные символы (буквы, цифры и подчёркивание), \d описывает цифры, и т.д. Аналогично, \W и \D описывают всё кроме словесных символов и цифр, соотв.
    Тогда у тебя будет два варианта
    Если подчёркивание - не проблема:
    re.sub(r'\W', '', 'test:_:test', re.I)  # даст test_test

    Если подчёркивание тоже нужно убрать:
    re.sub(r'[\W_]', '', 'test:_:test', re.I)  # даст testtest
    Ответ написан
    1 комментарий
  • Не работает код ошибки Python Bot?

    Vindicar
    @Vindicar
    RTFM!
    group_members = await bot.get_chat_member(group_id)

    Я подозреваю, что ты хотел вызвать bot.get_chat_members()
    Ответ написан
    Комментировать
  • Почему код не работает асинхронно?

    Vindicar
    @Vindicar
    RTFM!
    async def parse_card(card):
        d = dict()
        # из карточки берется html
        # "вставляется" в объект супа
        # и возвращается словарь
        # внутри этой функции не используются await
        return d


    Ну а ты что хочешь-то? Асинхронность в питоне предназначена для распараллеливания операций ввода-вывода (и сводимых к ним), а не для параллельного выполнения расчётов. У тебя parse_card() всё равно что синхронная.
    Ответ написан
    1 комментарий
  • Как вернуть значение из класса?

    Vindicar
    @Vindicar
    RTFM!
    Плохо гуглил. Впрочем, если гуглил по запросу "вернуть значение из класса" (что есть бессмыслица) вместо хотя бы "строковое представление объекта", то неудивительно.
    Ответ написан
    Комментировать
  • Как разделить код на несколько файлов?

    Vindicar
    @Vindicar
    RTFM!
    У тебя будет проблема с циклическим импортом: основной файл будет импортировать модули с функциями, но этим модулям будет требоваться экземпляр бота, описанный в основном файле. Эту проблему можно обойти так:
    # submodule_1.py  - модуль, содержащий часть функций бота
    def setup(bot):  
        # bot - объект бота. Можешь добавить и другие полезные параметры, такие как:
        # - объект logging.Logger для журналирования
        # - объект соединения с БД
        # - ну и что там ещё тебе потребуется
    
        # все обработчики событий объявляем ВНУТРИ setup()
        # тогда они смогут ссылаться на переданные параметры
        @bot.command('/start')  # например, чтобы использовать декораторы
        def on_start(message):
            message.reply('foobar')
    # мы описали функцию setup(), но здесь мы её не вызываем!
    
    
    # main.py - основной файл бота
    bot = ...  # создаём объект бота
    
    import submodule_1  # импортируем модуль с функциями
    # при вызове setup() будут заданы обработчики событий, описанные в ней
    submodule_1.setup(bot)  # функции передаём объект бота (и другие объекты, если она их ожидает)
    # функцию setup() нужно вызывать не более одного раза!
    # так можно добавлять столько модулей, сколько требуется.
    
    bot.run()  # дальше бота запускаем как обычно
    Ответ написан
    2 комментария
  • Как обработать исключение в telebot?

    Vindicar
    @Vindicar
    RTFM!
    Ну тебе же прямо написало строку, в которой ошибка.
    chat_member = bot.get_chat_member(id_list_channel[-1], 6276048962)

    И эта строка у тебя НЕ завёрнута в try-except.
    Ответ написан
  • Как вывести сообщения пользователя в бд?

    Vindicar
    @Vindicar
    RTFM!
    @dp.callback_query_handler(text='1')
    async def id1(callback: CallbackQuery):

    Этот обработчик прикреплён к кнопкам в сообщении /start. Поэтому callback.message указывает именно на это сообщение.
    А тебе нужно дождаться следующего сообщения. Читай про finite state machine.
    Ответ написан
    Комментировать
  • При запуске скрипта пишет 'NoneType' object has no attribute 'encode' Check your login or password please! как решить проблему?

    Vindicar
    @Vindicar
    RTFM!
    Ну если 31я строка, то разгадка несложная. Ты откуда пароль-то получаешь?
    Через os.getenv(). А если переменная окружения (в твоему случае EMAIL_PASSWORD) не задана, то getenv() вернёт None. Твой код эту возможность не учитывает.
    Ответ написан
  • Как временно хранить кэш в python?

    Vindicar
    @Vindicar
    RTFM!
    Реализуй кэш как отдельную функцию, самостоятельно или через functools.
    def do_stuff_nocache(*args, **kwargs):
        ...
    
    @lru_cache
    def do_stuff(*args, **kwargs):
        return do_stuff_nocache(*args, **kwargs)


    Ну или залезь в кишки lru_cache. Но это плохая идея, так как если ты уберешь декоратор, код сломается.
    @lru_cache
    def do_stuff(*args, **kwargs):
        ...
    
    
    print(do_stuff.__wrapped__(*args, **kwargs))


    Еще можно сделать do_stuff.clear_cache() но это очистит кэш вообще, что, скорее всего, нежелательно.
    Ответ написан
    Комментировать
  • Как получить нажатую реакцию из ЛС бота discord pycord?

    Vindicar
    @Vindicar
    RTFM!
    В документацию к используемой библиотеке? По идее реакции в ЛС обрабатываются точно так же, как реакции на сервере, разницы быть не должно.
    Если ты используешь discord.py, то можешь
    а) попытаться использовать wait_for()
    б) хранить где-то соотношение "id пользователя - id сообщения", и обрабатывать on_reaction_add(). А в обработчике уже смотреть, если данному сообщению сопоставлен ждущий роли пользователь - дать роль.
    Ответ написан
  • Как принимать и обрабатвать ключи типа `-key "value"` в строках?

    Vindicar
    @Vindicar
    RTFM!
    argparse, но ей требуется уже подготовленный список токенов, т.е. отдельных частей строки. Такой список можно сделать через shlex.
    Ответ написан
    Комментировать
  • Почему не работает программа нормально?

    Vindicar
    @Vindicar
    RTFM!
    Ты объявляешь функцию replay(), но не вызываешь её.
    А вообще, тебе тут нужен цикл, а не рекурсия.
    Ответ написан
    Комментировать
  • Как перевести строку со шрифтом в обычный текст?

    Vindicar
    @Vindicar
    RTFM!
    Встроенной функции нет. И похоже, что речь идёт не столько о разных шрифтах, а сколько о гомоглифах - символах юникода из разных алфавитов, которые выглядят похоже. Например, как русское и латинское "о". Это нетривиальная задача, но пакет confusable_homoglyphs (ставится через pip) может помочь. В частности, функция is_confusable().
    from confusable_homoglyphs.confusables import is_confusable
    
    
    wtf = 'YOᑌ ᑎᗩᗰE 42'
    
    is_good = []
    result = []
    for c in wtf:
        data = is_confusable(c, preferred_aliases=[], greedy=True)
        if data:
            data = data[0]
            alias = data['alias']
            if alias in ('LATIN', 'COMMON'):
                data = False
        if data:
            is_good.append('!')
            print(data)
            result.append(data['homoglyphs'][0]['c'])
        else:
            is_good.append(' ')
            result.append(c)
        print()
    print(''.join(result))
    print(''.join(is_good))

    Работает неидеально, но настройки модуля лежат в JSON - можно кое-что поправить. Или создать issue на гитхабе проекта.

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

    Vindicar
    @Vindicar
    RTFM!
    CREATE TABLE IF NOT EXISTS accounts (
                    id INTEGER PRIMARY KEY AUTOINCREMENT, 
                    users_name TEXT, 
                    acc_id INTEGER
    )

    Doplis01, ну вот и результат. Если у тебя УЖЕ ЕСТЬ уникальное для каждого пользователя целое число acc_id (естественный ключ), зачем ты добавил синтетический ключ id? Просто переделай таблицу, выкинь id, сделай acc_id PRIMARY_KEY без автоинкремента.
    Ответ написан
    2 комментария
  • Почему код из книги Эрика Метиза "Изучаем Python" не работает?

    Vindicar
    @Vindicar
    RTFM!
    def build_person(first_name, last_name, age=None):
    Ответ написан
    Комментировать
  • Почему съезжает последний элемент?

    Vindicar
    @Vindicar
    RTFM!
    " "*(len(str(len(filenames)))-len(str(i+1)))
    1. Открой для себя переменное выравнивание в форматировании
    2. Открой для себя join()
    3. Открой для себя второй параметр enumerate()

    max_index_len = len(str(len(filenames)))
    m = '\n'.join([
        f"{i:>{max_index_len}}. {filename}" 
        for i, filename in enumerate(filenames, 1)
    ])
    Ответ написан
    4 комментария
  • Как создать триггер cv2 Python?

    Vindicar
    @Vindicar
    RTFM!
    1. Выясни, что возвращает haar_cascade.detectMultiScale(), если в кадре нет лица - None или пустой массив?
    2. Храни флаг "на прошлом кадре было лицо", обновляй его в конце тела цикла while True
    3. После детекта лица проверяй, если на прошлом кадре лица не было, а на новом есть - делай отправку уведомления.

    А вот как подружить ТГ бота с этим циклом - уже второй вопрос. Я бы запустил приведённый код в потоке и использовал queue.Queue для связи потока с анализом видео и потока с ботом. Т.е. когда обнаружил лицо, кидаешь кадр в очередь. А в основном потоке периодически проверяешь очередь на предмет наличия новых кадров.
    Альтернативно, если бот асинхронный, можно переделать цикл на корутину, добавив небольшую задержку через await asyncio.sleep() и заменив requests на aiohttp. Не очень изящное решение, но может и сойдёт.
    Ответ написан
    Комментировать
  • Как пофиксить RuntimeError: This event loop is already running?

    Vindicar
    @Vindicar
    RTFM!
    Разработчик - идиот и не подумал, что его код может вызываться в асинхронной программе. Либа валится не только в асинхронной программе, но и в Jupyter Notebook, и в Google Collab, потому что и тот и тот по природе асинхронные. Фикс обещается с прошлого мая, а воз и ныне там.
    Но на гитхабе описан костыль с пакетом nest-asyncio. Попробуй его. Просто поставь пакет и добавь в начало кода бота:
    import nest_asyncio
    nest_asyncio.apply()

    С моей точки зрения это грязнущщий хак, но всё же лучше чем ничего.
    Ответ написан
    5 комментариев