Ответы пользователя по тегу Python
  • Почему не работает код на 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(), чтобы не компилить регулярку при каждом запросе.
    Ответ написан
    Комментировать
  • Как прописать список при помощи потоков?

    Vindicar
    @Vindicar
    RTFM!
    Я поддерживаю ответ dooMoob выше, но от себя добавлю: когда разберёшься с потоками, посмотри модуль queue.
    Ответ написан
    Комментировать
  • Как в aiogram передать переменную из одного хэндлера в другой?

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

    А конкретно по вопросу: нужно в profil() делать запрос вроде SELECT * FROM Users WHERE User_id == message.from_user.id

    И да, не надо формировать SQL-запросы через форматирование строк, это хороший способ выстрелить себе в ногу. Почитайте про работу с placeholders.
    Ответ написан
    1 комментарий
  • Как отправить музыку через bot.send_audio (telebot, python)?

    Vindicar
    @Vindicar
    RTFM!
    Ты используешь pyTelegramBotAPI? Если заглянуть на гитхаб проекта, можно найти любопытный комментарий в одном из issue:
    You can't set title and performer when you are sending audio by url, but there would be no problem if you will do the same with local file

    Т.е. параметры типа title/performer/thumb работают только при загрузке файла, а не ссылки. ФЗ правда ли это, и если да, то почему такое ограничение.
    Ответ написан
    5 комментариев
  • Почему Телеграм api блокирует client.get_entity()?

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

    Vindicar
    @Vindicar
    RTFM!
    Ну ошибку даже автопереводчик расшифрует: конструктору класса неизвестен аргумент threaded, который ты передаёшь.
    Вот почему он неизвестен - уже интереснее. Это аргумент есть там уже лет 6.
    Опечатки типа русская/латинская "e" я не наблюдаю...
    На всякий случай уточни версию пакета telebot, который у тебя стоит. Последнйи релиз у них - 3.8.1.
    Ответ написан
  • В чем ошибка sqlite python?

    Vindicar
    @Vindicar
    RTFM!
    img2 = open(f'{maxmark[2][0]}', 'rb')
                mime = magic.Magic(mime=True)
                filename = mime.from_file(maxmark[2])


    Строка один подразумевает, что имя файл - это maxmark[2][0]. Тогда maxmark[2] - это наверно, коллекция, кортеж, список или словарь, потому что я не думаю что вы открываете файл с именем из одного символа. К слову, зачем f'{maxmark[2][0]}'?
    Но в строке три судя по названию метода, нужно передать строку с путём к файлу файла - а передаётся туда maxmark[2], которое мы уже определили как возможный кортеж.
    Это совпадает с текстом ошибки.
    Ответ написан
  • Как проверить свернуто ли окно?

    Vindicar
    @Vindicar
    RTFM!
    Насколько я понимаю, на чистом питоне это будет сделать затруднительно. Нужно использовать платформо-зависимые инструменты.
    Если под Windows, то можно использовать WinAPI. Чтобы обращаться к ним под питоном, используй пакет pywin32.
    Функция IsIconic() проверяет, свёрнуто ли окно с указанным дескриптором в панель задач. Передай ему дескриптор окна, которое надо проверить.
    Функция GetForegroundWindow() получает дескриптор окна, которое сейчас в фокусе. Не уверен, идёт ли речь об окне верхнего уровня, или об элементе управления в фокусе (элементы управления - тоже окна). Оно возвращает дескриптор окна, если дескриптор равен желаемому - значит, искомое окно сейчас в фокусе.
    Так как тебе потребуется узнать дескриптор нужного окна, посмотри также FindWindow(). Имя класса окна надёжнее, но его труднее узнать. Заголовок окна может меняться (например, у браузера он зависит от текущей вкладки), но зато его узнать легче. При этом речь идёт о точном совпадении заголовка окна!
    Если заголовок меняется, то стоит использовать EnumWindows(), но с ней сложнее работать.
    Ответ написан
    Комментировать
  • Как добавить к названию переменой символ?

    Vindicar
    @Vindicar
    RTFM!
    temp = [str(res["daily"][i]["temp"]["day"]) for i in range(0, 9)]
    print('Всего:', len(temp))
    print('Все:', temp)
    print('Нулевой:', temp[0])

    Учитесь работе со списками, пригодится.
    Ответ написан
    1 комментарий
  • Есть 2 блока, на погоду и на поговорить. Как сделать так чтоб если я выбрал "Погода" то он показывал погоду без повторного запроса?

    Vindicar
    @Vindicar
    RTFM!
    Храни состояние для пользователя.
    Т.е. для каждого пользователя нужна какая-то структура данных, которая будет хранить информацию - запрашивал ли пользователь погоду (и если да, то в каком городе), находится ли пользователь в режиме разговора, и так далее.
    Кроме того, нужно решить - хочешь ли ты, чтобы бот запоминал это между перезапусками? Если можно ограничиться запоминанием в рамках одной рабочей сессии, то дело упрощается. Если нет, то нужно будет разбираться с базами данных.
    Ответ написан
    Комментировать
  • Не удается скопировать файл через shutil. [Errno 13] Permission denied. Что делать?

    Vindicar
    @Vindicar
    RTFM!
    Во-первых, освойте стандартную библиотеку pathlib для работы с путями, будет намного проще. В частности, посмотрите в сторону Path.expanduser().
    Во-вторых, разберитесь с параметром exist_ok в функциях создания каталога и копирования, чтобы не писать if'ы для создания директорий.
    В-третьих, copyfile() работает только с файлами, как следует из названия. Она не понимает, что делать с директорией. Поведение, которые вы ожидаете, даёт функция shutil.copytree().
    Ответ написан
    Комментировать
  • Как решить проблему с правами бота в discord py?

    Vindicar
    @Vindicar
    RTFM!
    Чужие сообщения редактировать нельзя. См. тут.
    Raises

    HTTPException – Editing the message failed.

    Forbidden – Tried to suppress a message without permissions or edited a message’s content or embed that isn’t yours.

    Ответ написан
    Комментировать
  • Почему все словари с списки пустые, кроме первого?

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

    Измените код так, чтобы у каждого пользователя был свой словарь, и раскладывайте данные по ним. Например, сделайте словарь верхнего уровня, где ключ - id_пользователя.
    Ответ написан
    Комментировать
  • Как правильно продумать архетектуру бота?

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

    Наконец, стоит использовать либо asyncio.Queue (без потоков) либо queue.Queue (с потоками), чтобы организовать передачу итогов парсинга боту. В первом случае бот может просто в цикле await'ить метод get() очереди, и по получению очередного блока данных формировать и отправлять сообщение.
    Ответ написан
    Комментировать
  • Я делаю код для парсинга сайтов и мне выдает ошибку name 'html' is not defined как мне это пофиксить?

    Vindicar
    @Vindicar
    RTFM!
    В Питоне имена переменных чувствительны к регистру, HTML и html - это две разные переменные.
    Ответ написан
    Комментировать
  • Как исправить бота с несколькими потоками?

    Vindicar
    @Vindicar
    RTFM!
    Я бы посоветовал использовать asyncio.Queue, но там есть тонкости при работе с несколькими потоками.
    Пусть поток-парсер вообще не занимается вопросами работы с ботом, а просто периодически производит парсинг, и если есть новости - кладёт их описание в выходную очередь. Он должен делать это с помощью call_soon_threadsafe(), как описано тут, так как класс asyncio.Queue не является потокобезопасным.
    Зато бот в главном потоке может просто в цикле await'ить метод get() очереди, и отправлять сообщения по получению очередного объекта.

    Альтернатива - использовать классический потокобезопасный queue.
    Так будет проще помещать в него результаты парсинга, но сложнее их извлекать - придётся периодически (типа раз в 1-5 секунд) вызывать метод get_nowait(), чтобы узнать, есть ли что-то в очереди. Блокирующий get() подвесит бота.
    Ответ написан
    3 комментария
  • Как отследить статус выполнения скрипта?

    Vindicar
    @Vindicar
    RTFM!
    Используй пару queue и отдельный поток для обработки ссылок.
    Обработчик читает описание запроса (например, ссылку и id отправителя) из первой очереди, обрабатывает её, и кладёт результат во вторую очередь.
    Основной бот при получении ссылки пытается положить её в первую очередь (можно добавить ограничение на максимальный размер очереди!). Также он должен время от времени заглядывать во вторую очередь. Если там что-то есть, то извлечь результат обработки ссылки, и сделать с ним что требуется (например, отправить пользователю).

    Плюс такой схемы в том, что можно запустить несколько потоков-обработчиков, если ресурсы компа позволяют. Но нужно будет продумать момент с их остановкой при завершении работы бота.
    Ответ написан
    Комментировать