Ответы пользователя по тегу Python
  • Как исправить следующую ошибку?

    Vindicar
    @Vindicar
    RTFM!
    Гуглинг нашел вот этот ответ на stackoverflow.
    Если я верно понял, там предлагается сделать так:
    from tqdm._tqdm_notebook import tqdm_notebook
    tqdm_notebook.pandas()

    И далее по тексту. Но гарантий дать не могу, сам с такой ошибкой не сталкивался.
    Ответ написан
    1 комментарий
  • Как проверить присутствие данного файла в данном каталоге с помощью os.listdir()?

    Vindicar
    @Vindicar
    RTFM!
    Что-то типа такого. Метод resolve() нужен, чтобы разобраться с элементами типа .. и символическими ссылками, и получить абсолютные пути.
    from pathlib import Path
    target_path = ... #определяешь целевой путь
    
    if Path(sys.argv[0]).parent.resolve() == Path(target_path).resolve():
        print('Тот же путь!') #оба пути указывают на один каталог
    Ответ написан
    Комментировать
  • Не могу спарсить страницу?

    Vindicar
    @Vindicar
    RTFM!
    1. Проверь, что за ответ получает твой скрипт от сайта (тупо запиши в файл и посмотри). Многие сайты защищаются от таких горе-парсеров.
    2. Даже если сайт не защищается специально, информация может подгружаться скриптом, т.е. страница изначально её не содержит. В этом случае нужно или реверс-инжинирить скрипт (выяснять, что за запрос он делает и пытаться воспроизвести), или использовать управляемый скриптом браузер типа selenium.
    Ответ написан
    Комментировать
  • Свойства файлов в python?

    Vindicar
    @Vindicar
    RTFM!
    Для каждого формата файла всё равно потребуется свой отдельный подход.
    Тема изображения - вообще не вариант. Разве что ты хочешь обучать классификатор и потом гонять его на каждом изображении.
    Ответ написан
  • Подписка на софт на пайтоне?

    Vindicar
    @Vindicar
    RTFM!
    Посмотри в сторону pyarmor, он это умеет (и, главное, умеет обфусцировать код, чтобы защиту было не так-то просто отломать). Обойти его можно, но уже не совсем тривиально.
    Ответ написан
  • Как настроить расширение frame'ов?

    Vindicar
    @Vindicar
    RTFM!
    self.surf.grid_columnconfigure(0, weight=1)
    self.surf.grid_columnconfigure(1, weight=1)

    Обозначит, что при расширении сжатии оба столбца должны расширяться одинаково.
    Если веса сделать, скажем, 3 и 1, то столбец с весом три "отъест" 75% дополнительного пространства, а с весом 1 - 25%. Если вес столбца 0, он не меняет размер.

    Аналогично есть метод .grid_rowconfigure().
    Ответ написан
    3 комментария
  • Как разобрать запрос на несколько переменных в боте телеграм?

    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 комментария
  • Нужно как-то остановить цикл и после проверки модератора продолжить его. Бот телеграм(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 комментария
  • Почему не вызывается if в хэндлере?

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

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

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

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

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