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

    Vindicar
    @Vindicar
    RTFM!
    file = open('Файл.txt', 'r', encoding = 'utf-8'), то есть работаю с файлом, который находится в папке с main.py,

    Неправильно. Ты работаешь с файлом, который находится в текущем рабочем каталоге, так как ты указал относительный путь (т.е. не от корня диска).
    Текущий рабочий каталог может совпадать или не совпадать с каталогом, в котором находится скрипт. Это зависит от поведения программы, которая скрипт запускает, будь то проводник винды, командная строка или ещё что. Кроме того, программа может менять свой текущий рабочий каталог при желании.
    Иными словами, ты не контролируешь, какой будет рабочий каталог на момент запуска программы - разве что поменяешь его самостоятельно.
    Так что лучше указывать абсолютный путь. Самый простой способ - получить из sys.argv[0] путь к скрипту и подняться на уровень выше. Вот тогда получишь путь к папке где лежит твой скрипт. И от этого пути уже отталкивайся.
    Операции с путями удобнее всего делать с помощью pathlib, или по старинке с помощью os.path.
    Ответ написан
    Комментировать
  • Как спарсить динамический текст python?

    Vindicar
    @Vindicar
    RTFM!
    Они обновляются скриптом наверняка. А скрипт наверняка делает фоновый запрос к бэкэнду сайта.
    Отсюда:
    а) Выяснить, что это за запрос, и научиться его выполнять самостоятельно с помощью requests. Бонус - наверняка там что-то удобочитаемое, типа JSON, а не HTML.
    б) Использовать полноценный браузер, умеющий выполнять скрипты, типа selenium. Громоздко и медленно, но зато позволяет успешнее косить под обычного пользователя.
    Ответ написан
    Комментировать
  • Как взаимодействовать с mp3 файлами через код? (python)?

    Vindicar
    @Vindicar
    RTFM!
    Ты открыл файл для чтения как последовательность байт и поставил указатель твоего открытого файла в начало.
    Вопрос: как это повлияет на чтение файла дискордом, если он открывает файл самостоятельно?

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

    Vindicar
    @Vindicar
    RTFM!
    Когда ты делаешь with self.connection, ты создаёшь транзакцию БД - т.е. связный набор операций, которые будут либо все вместе применены, либо все вместе отвергнуты. Так как у тебя только одна операция каждый раз, это не имеет смысла.
    А вот курсор у тебя используется один и тот же, вне транзакции. Это не дело. Лучше создавай его заново внутри метода.
    Ответ написан
  • Как ботом из телеграма выполнить определённую команду из скрипта?

    Vindicar
    @Vindicar
    RTFM!
    @bot.message_handler(func=lambda m: True)
    Заменяешь лямбду на свою функцию, которая расшифровывает сообщение, и возвращает True для правильного текста. Что-то типа
    @bot.message_handler(func=lambda m: my_msg_decode(m) == '/help')
    А уж реализацию my_msg_decode() придётся писать самому.
    Ответ написан
    Комментировать
  • Как сделать так, чтобы команда бота дискорд работала только при условии, что человек в голосовом чате (python)?

    Vindicar
    @Vindicar
    RTFM!
    Как всегда, читаем документацию.
    Member.voice может содержать либо None, либо объект VoiceState. А VoiceState, в свою очередь, имеет поле channel.
    Дальше догадаешься?
    Если нет, один подход - проверить поле members у полученного объекта VoiceChannel. Но можно и по-другому.
    Ответ написан
  • Как исправить AttributeError: 'Client' object has no attribute 'command'?

    Vindicar
    @Vindicar
    RTFM!
    На кой огурец тебе И экземпляр Client И экземпляр Bot?
    Ты вообще документацию на discord.py читал?
    class discord.ext.commands.Bot
    Represents a discord bot.
    This class is a subclass of discord.Client and as a result anything that you can do with a discord.Client you can do with this bot.

    Выделение моё. Bot умеет всё, что умеет Client, так что Client имеет смысл использовать ТОЛЬКО если тебе не нужны фичи и поведение именно Bot.

    Ну и фарш в импортах тоже хорош.
    from discord.ext import commands
    from discord.ext.commands import Bot

    А потом всё равно используешь commands.Bot.
    Давай, приводи код в порядок.
    Ответ написан
    Комментировать
  • Как сделать изменение ника в telegram по кнопке?

    Vindicar
    @Vindicar
    RTFM!
    Что мешает засунуть with внутрь ChangeNick()?
    Ответ написан
    Комментировать
  • Как сделать независимый while в python?

    Vindicar
    @Vindicar
    RTFM!
    1. Не надо так делать. Сайту твоя долбёжка запросами не понравится. Как минимум, введи задержку от 10 минут и более.
    2. Ты ознакомился с тем, как вообще работают асинхронные приложения? Судя по терминологии вроде "независимый while", нет. Почитай на эту тему, она не тривиальная, но без понимания основ асинхронщины ты далеко не уедешь.
    3. Зависит от библиотеки, но так или иначе тебе нужна корутина, которая сначала делает запрос к сайту (лучше тоже асинхронно, с помощью aiohttp) и обновляет хранимые в кэше сведения, а потом спит нужный интервал времени (и не с помощью time.sleep()!). Эту корутину надо запустить в рабочем цикле (loop) asyncio, а потом уже запускать остального бота. Тогда боту практически всегда будет доступен этот кэш.
    Ответ написан
    Комментировать
  • Как я могу использовать меньше конструкций try-except?

    Vindicar
    @Vindicar
    RTFM!
    Иногда проще отрефакторить такое в список или словарь.
    errors = [
      "//div[contains(text(),'Такой код не найден!')]",
      "//div[contains(text(),'Данный код не может быть использован')]",
      "//div[contains(text(),'Вы не можете использовать код')]",
    ]
    
    for err in errors:
      try:
        close_error = browser.find_element(By.XPATH, err)
        close_error.click()
        break
      except NoSuchElementException:
        pass
    else:
      print("Not a single error was found")
    Ответ написан
    Комментировать
  • Каким должен быть модификатор доступа при инициализации свойства?

    Vindicar
    @Vindicar
    RTFM!
    Не, ну а в чем вопрос-то.
    В первом случае ты вообще обходишь сеттер свойства, присваивая значение напрямую приватному полю. Сеттер не вызывается, так как ты не обращаешься к свойству bat_capacity.
    Во втором случае ты присваиваешь значение свойству, тем самым провоцируя срабатывание сеттера, который и валидирует значение.
    61ee67404277a591391562.png
    Ответ написан
    3 комментария
  • Как остановить цикл по нажатию инлайн кнопки в aiogram?

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

    Vindicar
    @Vindicar
    RTFM!
    if scapy_packet.haslayer(DNSRR):
    qname = scapy_packet[DNSQR].qname

    Ты уверен, что тут должны быть разные типы пакетов (DNSRR и DNSQR)? Они НЕ являются подклассами друг друга, они оба - подклассы InheritOriginDNSStrPacket, а значит, не взаимозаменяемы.
    Ответ написан
  • Есть ли кейс default в switch(match) у питона?

    Vindicar
    @Vindicar
    RTFM!
    case _:
    Но вообще switch в питоне та ещё штучка, с ним надо быть очень осторожным. Если веток немного - я бы оставил if-elif-else.
    Ответ написан
  • Почему Chrome бесконечно посылает пустые запросы?

    Vindicar
    @Vindicar
    RTFM!
    while request != 'quit':

    И впрямь, почему программа циклится...
    Если бы только в документации было описано поведение read(), когда соединение к клиенту закрыто!
    Ответ написан
    2 комментария
  • Как исправить ошибку синтаксиса при аггрегации (mongodb discord.py)?

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

    Vindicar
    @Vindicar
    RTFM!
    Ну идея такая...
    Допустим у нас K человек, и предположим что мы вызвали N машин. Первую оценку N1 можно получить так - это количество чисел больше 210. Меньше этого количества машин мы не обойдемся.
    Вторую оценку N2 можно получить так: число человек / 4 и округлить вверх. Соответственно, начинаем поиск N начиная с max(N1, N2) и идём вверх.

    Раз на переднем сидении может сидеть человек любого веса, то тогда имеет смысл "выкинуть" N наибольших чисел из списка - этих людей мы посадим на передние сидения.
    Тогда остальные M = N - K чисел надо будет попытаться разбить на тройки так, чтобы сумма каждой тройки не превышала 210 кг. А значит, сумма этих чисел, деленная на 210, даст нам третью оценку N3 количества машин, т.е. "точно не меньше чем столько". Если N3 > N, значит, нужно увеличить N и попытаться снова.

    Однако реально может потребоваться больше, например, если у нас остались числа 90, 90, 90, 90, 60. Сумма даст 420, т.е. две машины, но легко увидеть, что реально понадобится больше, так как попытка подсадить человека на 60 кг в любую из машин даст перебор.

    Искать тройки можно следующим образом. У нас осталось M чисел для распределения по тройкам.
    Строим трёхмерный массив, где каждому измерению соответствует один человек из тройки. Значение ячейки 210 минус сумма весов этих людей. Тогда мы можем легко найти такую ячейку массива, которая ближе всего к нулю, но при этом положительная. Это будет "оптимальная" тройка, которая ближе всего к предельной нагрузке. Выкидываем из массива соответсвующие "срезы", т.е. исключаем эту тройку людей из рассмотрения, и ищем следующую тройку. А дальше есть два варианта.
    Либо все элементы массива оказываются отрицательны - тогда оставшиеся люди не могут сформировать тройки, их нужно делить на пары по аналогии.
    Либо у нас в массиве остаётся три или меньше элементов. В этом случае эти элементы формируют последнюю (возможно неполную) тройку.
    Так или иначе, количество "троек" и "пар" должно совпасть с предполагаемым количеством N машин. Если их больше - нужно увеличить N и попытаться снова.

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

    Vindicar
    @Vindicar
    RTFM!
    x for x in data_dict
    если data_dict - это то что ты привел, то ты перебираешь ключи словаря ("status", "data")
    Тогда уж
    [item for item in data_dict['data'] if item['name'] == 'name1']
    Ответ написан
  • SQL как исправить ошибку?

    Vindicar
    @Vindicar
    RTFM!
    1. Не генерируй запросы через форматирование строк. Используй placeholders. Начиная со слов "the DB-API’s parameter substitution"
    2. Если тебе нужно вставить запись, если её нет, или не делать ничего, если она есть, почитай про INSERT ON CONFLICT DO NOTHING. Ну или про INSERT ON CONFLICT DO UPDATE, если нужно "вставить новую или обновить существующую".
    Ответ написан
    1 комментарий