Задать вопрос
  • Как разобрать запрос на несколько переменных в боте телеграм?

    Vindicar
    @Vindicar
    RTFM!
    Пример запроса? Он должен следовать какой-то специфической форме, я надеюсь?
    Если запрос просто состоит из некольких слов, разделённых пробелами (опционально, строка в кавычках считается одним словом), то посмотри в сторону shlex. Но кроме как "разбить строку по пробелами и экранировать кавычки" shlex мало что умеет.
    Если нужно подобие командной строки (с фишками типа --ключей и необязательных параметров), посмотри в сторону argparse. Тут тебе и преобразование типов данных (т.е. "вот этот параметр должен быть числом"), и справка об использовании, и ещё много чего.
    Если что-то ещё более заковыристое, то посмотри в сторону регулярных выражений. Они позволяют распознавать довольно заковыристые паттерны, но многое придётся делать вручную.
    Если нужен анализ естественной речи... это дело муторное.

    Так что я бы сначала посмотрел argparse. Оно заточено на аргументы командной строки, но чат-боты недалеко от неё ушли.
    Ответ написан
    4 комментария
  • Как добавить айдишников в конфиг.py?

    Vindicar
    @Vindicar
    RTFM!
    > operator = "4609....71" and "109....307"
    Извините мой французский, но что это за фигня? Вы применяете логические операторы к строкам, неужели ничего неладного не заподозрили?
    Вам нужна коллекция idшников, и нужно проверять вхождение в эту коллекцию!
    Например, множество (так как я не думаю, что оператор должен входить в список дважды, верно?):
    operators = {"4609....71",  "109....307"}
    for op in operators: #перебираем элементы множества
        await bot.forward_message(op, message.from_user.id, message.message_id)

    Тогда добавить нового оператора будет легко и просто:
    operators.add("1234....890")
    При этом при попытке повторного добавления просто ничего не произойдёт.
    Аналогично можно удалить:
    operators.remove("1234....890")
    При попытке удаления отсутствующего оператора будет выброшено KeyError.
    Ну и если надо проверить, является ли id оператором:
    if "1234...890" in operators:
    Ответ написан
    Комментировать
  • Как изменить sys.path в venv?

    Vindicar
    @Vindicar
    RTFM!
    А что за модули?
    Если это pip-пакеты, их нужно установить в этот конкретный venv, используя местный pip.
    Если это твои собственные модули, которыми ты часто пользуешься - можешь попытаться создать свой пакет и установить его как любой другой. Пакет не требуется загружать pypi.org, pip вполне устанавливает пакеты из файла.
    Если же это локальные модули проекта, то тут надо смотреть структуру каталогов этого проекта.
    Ответ написан
  • Sqlite3.OperationalError: no such table: users?

    Vindicar
    @Vindicar
    RTFM!
    Засунь текст ошибки в гугл-транслейт, что ли...
    Он тебе английским по белому говорит, что таблица users не создана. Как mr_forlife объяснил, нужно создать таблицу через запрос вида CREATE TABLE. Ты создаёшь только login_id, но не users.
    Ответ написан
    2 комментария
  • Не открывается скомпилированный файл .ехе, что делать?

    Vindicar
    @Vindicar
    RTFM!
    Открой терминал (cmd), и запусти исполняемый файл в нём. Скорее всего, программа выкидывает исключение и сразу выходит.
    Ответ написан
    Комментировать
  • Нужно как-то остановить цикл и после проверки модератора продолжить его. Бот телеграм(Telebot). Как это сделать?

    Vindicar
    @Vindicar
    RTFM!
    Нет, нельзя. Нужно архитектуру бота менять, так ты результата не добьёшься.

    1. Поступающие запросы складываешь в очередь (а лучше в БД).
    2. Бот периодически проверяет наличие непроверенных запросов и выкидывает их менеджеру. Так как менеджер - существо неторопливое, это можно делать раз в пару минут или даже реже.
    3. По реакции от менеджера запрос помечается как проверенный (одобренный/отклонённый).
    4. Бот периодически проверяет, есть ли проверенные, но не обработанные запросы. Если есть, обрабатывает их, и помечает их как обработанные.
    5. Опционально: периодически запросы, отмеченные как обработанные, удаляются из БД.
    Ответ написан
    Комментировать
  • No such column: id почему выхдает ошибку в discord.py ,sqlite3?

    Vindicar
    @Vindicar
    RTFM!
    Во-первых, оформляй код, нечитаемо же. Кнопка </>.

    Во-вторых, у тебя запрос на создание таблицы имеет вид CREATE TABLE IF NOT EXISTS - то есть если таблица уже существует, этот запрос молча ничего не сделает. Обычно так и надо - но проблема в том, что если таблица существует, но имеет другой, неправильный набор столбцов, этот запрос всё равно молча ничего не сделает! Он проверяет только существование таблицы, но не её структуру.

    Вот поэтому Hemul GM и просит тебя показать структуру таблицы, как она есть в базе данных. Это можно сделать парой способов, например так.
    Напиши отдельный простой скрипт на питоне, который подключается к твоей базе и выполняет следующий запрос:
    SELECT sql FROM sqlite_master WHERE name = 'users';

    Сравни набор столбцов в этом запросе со своим запросом. Если столбцы не совпадают, значит, имеет место та ситуация, о которой я писал выше. Тогда тебе придётся или удалить таблицу(а может и всю базу) а потом создать её заново, уже как надо... или выполнить запрос ALTER TABLE, чтобы изменить набор столбцов в таблице.
    Первое гораздо проще, если ты ещё только разрабатываешь бота, и в базе не хранится ценной информации.
    Ответ написан
    6 комментариев
  • Как решить ошибку TypeError: expected str, bytes or os.PathLike object, not list?

    Vindicar
    @Vindicar
    RTFM!
    os.walk(path)

    os.walk() принимает путь К ОДНОЙ директории, а ты пихаешь список
    Просто пройдись по path циклом, и каждый элемент уже обрабатывай.
    Ответ написан
    1 комментарий
  • Как подать на вход и получить с выхода нейросети массив на python,tensorflow?

    Vindicar
    @Vindicar
    RTFM!
    Смотря о каких массивах речь. Если размер массива известен и фиксирован, то тут читай любой туториал по тензорфлоу. Либо используй перцептрон, либо (если не покатит), пробуй более глубокую сеть.

    Если массив - это именно последовательность элементов переменной длины, то тебе нужны энкодеры или seq2seq сети.

    И опять же, в чём конкретно сложность? Код?
    Ответ написан
    Комментировать
  • Как изменить язык created_at.strftime?

    Vindicar
    @Vindicar
    RTFM!
    import locale
    locale.setlocale(0, "") #чтобы выбрать текущую локаль операционной системы
    # или 
    locale.setlocale(0, "ru-ru") #если нужна именно русская, даже если ОС не на русском.
    Ответ написан
    Комментировать
  • Как правильно прочитать файл с сохранением типов данных?

    Vindicar
    @Vindicar
    RTFM!
    Придётся парсер писать.
    В зависимости от сложности структуры данных, может быть умеренно сложно или очень сложно.
    Например, данные всегда содержат словарь одного уровня с числовыми ключами и значениями в виде списка числе, как в твоём примере? Или могут быть варианты?
    Для простых случаев можно разобрать строку вручную. Для сложных придётся въезжать в инструмент для создания парсеров типа ANTLR.
    Ответ написан
    Комментировать
  • Почему await con.commit() вызывает ошибку ValueError?

    Vindicar
    @Vindicar
    RTFM!
    Посмотри базовый пример, может, лучше переделать по его образу и подобию?

    pool = await aiomysql.create_pool(host='127.0.0.1', port=3306,
                                          user='root', password='',
                                          db='mysql', loop=loop)
        async with pool.acquire() as conn:
            async with conn.cursor() as cur:
                await cur.execute("SELECT 42;")
                print(cur.description)
                (r,) = await cur.fetchone()
                assert r == 42
        pool.close()
        await pool.wait_closed()
    Ответ написан
  • Как боту не прописывать некоторые строчки?

    Vindicar
    @Vindicar
    RTFM!
    Сделай подпрограмму, хотя бы.
    def format_non_zero(items):
        message_list = []
        for format, value in items:
            if value != 0:
                message_list.append(format.format(value))
        return message_list
    
    msg_parts = format_non_zero([ #каждый элемент списка - отдельное значение+его формат. Порядок тот же.
        ("У вас money: {0}", money), #обрати внимание на строку формата!
        ("У вас bank: {0}", bank),
        ("У вас brain: {0}", brain),
    ]) #функция вернёт список строк
    await message.reply('\n'.join(msg_parts)) #соединяем строки перед отправкой.
    Ответ написан
    Комментировать
  • Как сделать некоторые функции в telegrabotapi Python?

    Vindicar
    @Vindicar
    RTFM!
    1. "with con:" закроет соединение по выходу из блока with.
    2. Зачем вообще хранить справки, если вы их генерируете на лету? Или они будут как-то ещё обрабатываться?
    3. Я бы посоветовал вынести всё, что касается работы с базой и генерации PDF в отдельный класс, а боту оставить ботово, т.е. интеграцию с телегой. Так и отлаживать проще, и код поддерживать.
    Ответ написан
    3 комментария
  • Куда выгрузить discord бота?

    Vindicar
    @Vindicar
    RTFM!
    Ответ написан
    Комментировать
  • Почему не вызывается if в хэндлере?

    Vindicar
    @Vindicar
    RTFM!
    Это обработка нажатий на виртуальные кнопки?
    Каждое нажатие - это отдельный вызов обработчика.
    Обработчик, получивший polt, ещё ничего не знает об amf.
    Обработчик, получивший amf, уже ничего не будет знать о polt.

    Тебе нужно сохранять состояние для разных пользователей. Например, вести коллекцию пользователей, нажавших polt. Вообще тебе стоит почитать про конечные автоматы - теория будет звучать несколько заумно, но идея проста как две копейки.

    Состояние - это когда для объекта выполняется какое-то условие. Например, в нашем случае у пользователя есть два состояния - "не нажал на polt", "нажал на polt".
    Между состояниями есть переходы. В нашем случае есть один переход, который должен вызываться нажатием на polt.

    Отсюда вывод: мы для всех известных нам пользователей должны хранить их состояние. Обработчик callback_query_handler() должен при получении команды смотреть на их состояние и выполнять действия в завимости от сочетания команды и состояния. Действия могут включать в себя в т.ч. переход в другое состояние.

    Хранить состояния можешь пока что в словаре (dict), где ключ - id пользователя, а значение - код состояния. Но словарь будет потерян при перезапускке бота, так что потом тебе придётся освоить хранение в БД.
    Ответ написан
  • Почему не работает код на Python?

    Vindicar
    @Vindicar
    RTFM!
    Во-первых, оформи код кнопкой </>, а то нечитаемо.
    Во-вторых, дело в строке
    super().__init__(self.number)
    К этому моменту в self ещё нет ни одного атрибута. Унаследованный вызов __init__() создаст number и остальные - но ты пытаешься обратиться к self.number до этого вызова.
    Ответ написан
    Комментировать
  • Как отсортировать файл по алфавиту?

    Vindicar
    @Vindicar
    RTFM!
    Перепробовал множество способов из инета, говоришь...
    Тогда нужно включить голову и подумать самому. А для начала - разбить задачу на подзадачи.
    Задача №1: прочитать содержимое входного файла.
    Задача №2: превратить прочитанную строку в список элементов для сортировки
    Задача №3: отсортировать список по желаемому критерию
    Задача №4: записать отсортированный список в выходной файл.

    Теперь по пунктам.
    №1. Ты ошибся в том, что .readlines() создаёт список, где каждая строка - один элемент. У тебя все элементы списка на одной строке, так что readlines() тебе не поможет. Используем просто .read()
    with open('p022_names.txt', 'rt', encoding='utf-8') as src: #а может кодировка не utf-8? Тогда поменяй на нужную
        content = src.read() #читаем всё содержимое файла в память. Если файл размером под гигабайт, будет весело... но для маленьких файлов сойдёт
    # with позволяет гарантированно автоматически закрыть файл по выходу из блока


    №2. Гуглим работу со строками в питоне. Самый большой вопрос: может ли в имени встретиться запятая? Если нет, то решается всё очень просто:
    items = content.split(',')
    Это даст нам список строк, но с тремя оговорками.
    1) последняя запятая даст нам элемент списка - пустую строку.
    Если это недопустимо, то следует от пустых строк избавиться:
    items = [item for item in content.split(',') if item != '']

    2) Строки в списках будут в кавычках. На сортировку это не повлияет, но если нужно избавиться от них, нужен будет ещё один шаг.
    3) Если в конце строки есть перевод строки \n, то от него нужно избавиться до разбиения: content = content.rstrip()

    №3. Сортируем список прямо на месте: items.sort(). В отличие от метода .sort(), sorted() создаёт и возвращает новый сортированный список, не трогая старый. Если нужно по убыванию, items.sort(reverse=True).

    №4. content = ','.join(items) чтобы склеить элементы обратно. Если последняя запятая нужна, то content = (','.join(items)) + ','. .join() работает эффективнее, чем проход циклом for вручную.
    Ну и записать в файл:
    with open('p022_names_sorted.txt', 'wt', encoding='utf-8') as dst: # можно писать и в тот же самый файл - он уже закрыт к этому моменту, так что можем его переоткрыть для записи.
        dst.write(content)
    Ответ написан
  • Keras: как правильно отправить numpy?

    Vindicar
    @Vindicar
    RTFM!
    Ошибка говорит, что у тебя в картинке 4 канала вместо трёх.
    Я думаю, дело в cv2.IMREAD_UNCHANGED. Зачастую RGB-изображения имеют неиспользуемый 4й байт в пикселе, для выравнивания адресов пикселей в памяти. IMREAD_UNCHANGED означает, что этот байт загружается как есть, вот и получается 4 канала.
    Попробуй заменить на IMREAD_COLOR.
    Ответ написан
    2 комментария
  • Как распарсить лог на python?

    Vindicar
    @Vindicar
    RTFM!
    Для подсчёта можно использовать collections.Counter.
    Модуль csv для формирования csv файла.
    Если задача позволяет, не надо сначала загружать всё в память, а потом выгружать в csv - лучше выгружать по мере нахождения строк. Но чтобы дать подробный совет, нужно видеть пример искомых строк в лог файле.
    Также, если выражение применяется более чем 1-2 раза, посоветую использовать re.compile() с последующим методом .findall() вместо просто re.findall(), чтобы не компилить регулярку при каждом запросе.
    Ответ написан
    Комментировать