Задать вопрос
  • Как заменить первую строку в файле csv Python?

    Vindicar
    @Vindicar
    RTFM!
    По простому - никак. Текстовый файл - это последовательность СИМВОЛОВ, а не строк.
    Так что если у тебя новые заголовки длиннее старых, то они перезапишут данные дальше. А если новые заголовки короче старых, то останётся кусок старых заголовков.
    Единственный вариант - записать в новый файл новые заголовки, потом перекопировать туда всё, кроме заголовков, из исходного файла. Затем удалить исходный файл, и переименовать новый в исходный.
    Ответ написан
    Комментировать
  • Почему возникло исключение: ModuleNotFoundError?

    Vindicar
    @Vindicar
    RTFM!
    Если config.py - это часть твоего проекта, то скрипт его не видит. Не зная структуры файлов и каталогов в твоём проекте, подробнее не скажешь.
    Ответ написан
    1 комментарий
  • Как заставить окно постоянно обновляться в tkinter?

    Vindicar
    @Vindicar
    RTFM!
    Потому что под капотом большинства оконных фреймворков крутится вечный цикл вида "получить оконное сообщение - определить событие - вызвать обработчик события". И следующее оконное сообщение не будет обработано, пока обработчик события не завершится. Как следствие, длительный код в обработчике "подвешивает" окно программы.
    Быстрое и грязное решение - дёргать метод update_idletasks() (погугли про него). Он позволит выполнить перерисовку компонентов GUI, не выходя из обработчика события.
    Чуть менее грязное - разбить выполняемую работу на маленькие блоки, выполнять блок, затем планировать выполнение следующего блока через метод after(). Тогда в промежутке между вызовом after() и фактическим выполнением кода у GUI будет время обработать поступающие сообщения. Но не всегда это возможно, да и о конкуррентном запуске надо думать (что если юзер кликнет кнопку дважды, а не однажды?)
    Ещё менее грязное - вынести длительный код в отдельный поток, научить поток оповещать о своём состоянии (например, менять содержимое переменной), а через after() реализовывать только опрос этой переменной и обновление GUI. Но переменную надо будет защищать мьютексом, чтобы не словить конфликт при одновременном обращении двух потоков.
    Ответ написан
    2 комментария
  • Как переделать 2d array в 3d?

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

    Либо грузи изображение как цветное, либо создавай массив вида высота х ширина х 3 и впиши в него свой исходный массив, в каждый канал.

    Подробнее не подскажу потому что хз что за структура данных используется - numpy массив, или питоновский array, или ещё что.
    Ответ написан
  • Как экспортировать NetCDF в ГИС-форматы с помощью Python?

    Vindicar
    @Vindicar
    RTFM!
    Из matplotlib выковырять едва ли получится. Раз уж можешь разобрать входной формат, то проще будет сразу на основании этих данных генерить нужные выходные данные. Есть пакет geojson, можешь попробовать взять его за основу.
    Ответ написан
    Комментировать
  • Как сделать так что бы бот python отвечал на команды?

    Vindicar
    @Vindicar
    RTFM!
    Ну ты же сейчас опять словишь удаление с формулировкой "задание а не вопрос"...
    И ответ всё тот же:
    man == ('давай поиграем?', 'Сыграем?')
    Такое сравнение НИКОГДА не сработает. Учи Питон, узнавай как производить множественное сравнение.
    Либо man == 'давай поиграем?' or man == 'Сыграем?'
    Либо man in ('давай поиграем?', 'Сыграем?')
    Ответ написан
    9 комментариев
  • Как запустить Python с консолью и без?

    Vindicar
    @Vindicar
    RTFM!
    Переименуй файл, дай расширение .pyw
    Ответ написан
    6 комментариев
  • Как эмулировать нажатие мышкой не забирая контроля над курсором?

    Vindicar
    @Vindicar
    RTFM!
    В selenium есть своё апи для нажатия кнопок, ты его использовал?
    Либо используй пакет pywinauto.
    Ответ написан
  • Как скомпилировать .exe файл Python?

    Vindicar
    @Vindicar
    RTFM!
    Поставь более старую версию pyinstaller, она наверняка уже в базах антивируса как "не вирус", тогда как новая - ещё нет.
    Ответ написан
  • Как сделать, чтобы бот считывал кол-во втрок в БД и выводил в сообщении разное кол-во строк (в зависимости от кол-ва строчек в бд) на aiogram?

    Vindicar
    @Vindicar
    RTFM!
    Скажи пожалуйста, как ты дошел до написания ботов, не зная, что такое конкатенация строк? >_<
    Любой из вариантов по ссылке можно применить к решению твоей задачи, это самые азы языка, черт побери.
    Ответ написан
    3 комментария
  • Пишу код для Telegram Бота, как не делать тупые ошибки?

    Vindicar
    @Vindicar
    RTFM!
    От того, что ты объявил функцию внутри другой функции, никакой магии не случится. Бот не узнает про неё, и не поймёт сам, что теперь её нужно вызвать.

    Тебе нужно читать про register_next_step_handler(), ну или посмотреть официальный пример на тему.
    Ответ написан
    1 комментарий
  • Зачем нужны потоки?

    Vindicar
    @Vindicar
    RTFM!
    Потоки имеют смысл, когда тебе нужно быстро и дёшево выделить синхронный код в отдельную единицу исполнения без заморочек межпроцессной коммуникации. Иными словами:
    - если выносимый код исполняется в течении длительного времени
    - если нет возможности или желания переделывать выносимый код в корутину, а хочется оставить вытесняющую многозадачность
    - если обмен данными с этой корутиной достаточно сложен, чтобы сериализация/десериализация не окупалась (хотя shared memory может помочь).
    - если код не нагружен вычислениями (в связи с GIL)

    В общем, потоки - это простое и ленивое решение.

    Пример раз: асинхронное приложение, но с GUI без поддержки асинхронщины. GUI требует рабочий цикл, asyncio требует цикл-реактор, подружить их в одном потоке трудно, а вытащить GUI в отдельный процесс может потребовать заморочек с организацией взаимодействия. Проще запустить GUI-цикл в отдельном потоке и работать с ним там. (Хотя иногда есть хаки, позволяющие обновлять GUI в рамках "while True:" корутины.)

    Пример два: асинхронная работа с файлами. Насколько я знаю, в питоне файлы чисто синхронные, а библиотеки для асинхронного доступа (типа aiofiles) под виндой "жульничают", выполняя синхронные операции как раз в отдельном потоке.
    Да и в целом, если нужно выполнить долгий синхронный код в асинхронном приложении, вынос его в отдельный поток может оказаться наиболее удобным решением.
    Ответ написан
    5 комментариев
  • ModuleNotFoundError: No module named 'telebot', почему?

    Vindicar
    @Vindicar
    RTFM!
    Проект использует системный интерпретатор питона, или виртуальное окружение?
    Ответ написан
  • Как сделать команду, действующую по разному на разных серверах?

    Vindicar
    @Vindicar
    RTFM!
    Сделать БД или иное хранилище, где ID сервера сопоставлено значение кулдауна, а также время последнего использования команды.
    При вызове команды пытаться выбрать из хранилища строку для сервера, на котором команда была вызвана.
    Если строка есть, проверяем время последнего использования, и вычисляем, прошёл ли кулдаун.
    Если прошёл - то записываем туда новое время, и выполняем команду. Если не прошел, ругаем отправителя команды.

    Если строки нет, решай сам. Можно интерпретировать это как "кулдауна для сервера нет", а можно добавлять в БД строку со значениями по умолчанию.

    В качестве хранилища можно использовать как СУБД, так и что-то попроще. Хоть словарь, который после изменения сбрасывается в JSON файл.
    Ответ написан
  • Как запустить код заново в Python?

    Vindicar
    @Vindicar
    RTFM!
    Про существование цикла while вроде знаешь. В чём вопрос тогда?
    И да, оформляй код по правилам сайта.
    Ответ написан
    1 комментарий
  • Как отсортировать массив экземпляров класса на Питоне?

    Vindicar
    @Vindicar
    RTFM!
    Смотри магические методы __gt__(), __lt__(), __eq__(), __neq__() для сравнения.
    Для реализации оператора [] смотри __getitem__() для чтения и __setitem__() для записи.

    Ну и задавай конкретный вопрос, что не понятно.
    Ответ написан
    3 комментария
  • Почему sqlite3 не сохраняет запись?

    Vindicar
    @Vindicar
    RTFM!
    f'''INSERT INTO {table_name}(date, id, username)
                        VALUES('{date}', '{user_id}', '{username}')'''

    Вот почему бы не почитать хоть какой-нибудь туториал или официальную документацию(начиная со слов "SQL operations usually need to use values from Python variables")?
    Я понимаю динамическое имя таблицы (хотя это тоже сомнительный ход), но уж параметры-то можно вставлять по-человечески.

    А вообще, выбери что-то одно. Если ты осваиваешь SQL, не выделывайся с динамической генерацией запросов, освойся с простыми вещами для начала. Если нет - используй ORM, тот же peewee для начала, пусть он за тебя генерит запросы.

    Ну и до кучи, как ты проверяешь, что в базу ничего не добавляется?
    Ответ написан
    4 комментария
  • Нужно сделать нумерацию Рейтинга игроков в боте я новичок в этом деле, поможете?

    Vindicar
    @Vindicar
    RTFM!
    for n, (user_nick, user_rating) in enumerate(data, 1):
        print(f'{n}. {user_nick} - {user_rating}')

    Под вывод через бота сам перепишешь.
    Ответ написан
    1 комментарий
  • Что с Traceback?

    Vindicar
    @Vindicar
    RTFM!
    BoyFromDubai, тебе же ясно написали:
    бразуеры при открытии страницы сайта делают дополнительный запрос к сайту, чтобы получить favicon. Этот запрос прилетает в ваш обработчик block.

    Т.е. запрос на /favicon.ico браузер сделает по своей инициативе, и тебе придётся с этим иметь дело. Вообще на будущее имей ввиду, что клиент может сделать любой бредовый запрос, так что ВСЕГДА нужно проверять, что тебе пришло.
    Возможных решений 3.
    1. Сменить url запроса, например так.
    @views.route('/block/<height>', methods=['GET'])
    Тогда у тебя запрос не будет конфликтовать с запросом favicon, но всё ещё будет ломаться, если клиент запросит /block/foobar вместо /block/123
    2. Указать тип параметра
    @views.route('/<height: int>', methods=['GET'])
    Тогда фреймворк отфильтрует нечисловые запросы, и сам преобразует стркоу в число. Это умеет и Django, и Flask. Но запрос сломается, если полученное число не будет корректным индексом/ключом для chain[].
    3. Вставить try-except
    try:
        block = blockchain.chain[int(height) - 1]
    except (ValueError, LookupError):
        # ловим ValueError от вызова int() и возможный LookupError от обращения к chain[]
        # хотя я фз что ещё может выбросить chain[]
        return "ОШИБКА БЛИН" # ну или более подробное сообщение об ошибке
    else:
        from main import blockchain
        return render_template("block.html", block = block, blockchain=blockchain)


    Я бы посоветовал сочетание методов 2 и 3. Пусть преобразованием в int занимается Flask, но всё же проверь, подходит ли это число.
    Ответ написан
    1 комментарий
  • Как сделать код более компактным?

    Vindicar
    @Vindicar
    RTFM!
    self.label_20
    Если ты ловишь себя на таком, пора заводить список и хранить ссылки на элементы в нём. Заодно позволит генерить эти элементы динамически.
    Ответ написан
    Комментировать