Задать вопрос
Ответы пользователя по тегу Python
  • Возможно ли закрыть файл.ini на python?

    Vindicar
    @Vindicar
    RTFM!
    Откуда у тебя приходит переменная config? Где она ещё используется?
    read() будет дочитывать данные в текущее состояние конфига, не сбрасывая его в ноль перед чтением.
    Не экономь, создавай отдельный экземпляр парсера на каждый файл.

    Ну и да, база данных в ini? Лучше не надо. sqlite не настолько сложен.
    Ответ написан
    Комментировать
  • Почему он выдает interrupt exception, который не ловится?

    Vindicar
    @Vindicar
    RTFM!
    Потому что вызов thread.start() который внутри start_listen() - не блокирующий. Главный поток продолжит работу, выйдет из try-except и завершится, так что на момент возникновения KeyboardInterrupt он уже будет завершён. Твой поток не помечен как daemon, поэтому интерпретатор продолжит работу (был бы помечен - программа бы завершилась тут же).
    Если ты делаешь join() - то пока запущенный поток не закончится, главный не продолжит работу.

    Собственно, в текущем виде тебе поток вообще не нужен, у тебя главный поток ничего не делает и так, и так.
    Что ты пытаешься сделать?
    Ответ написан
    Комментировать
  • Как получить какой-нибудь хеш от значения переменной (dict)?

    Vindicar
    @Vindicar
    RTFM!
    Очевидно, надо в каждом словаре найти значение, которое уникально идентифицирует соединение.
    Я бы сказал, это пара IP:порт удаленного узла (с которым установлено соединение).
    Не уверен, будет ли эта информация в словаре, так как ты не озаботился привести пример, и как это будет работать с UDP (где формальных соединений нет), но попытаться можно.
    Ответ написан
  • При команде `!mine` алмазы 0, как исправить?

    Vindicar
    @Vindicar
    RTFM!
    Рекомендую выучить язык, прежде чем писать ботов.
    Посмотри на свой код (выделено мной):

    elif user_data[5] == '<:939223290105454632:1164940159050059786>':
    ...
    elif user_data[5] == '<:939195860317773856:1164153649296048148>':
    ...
    elif user_data[5] == '<:939223290105454632:1164940159050059786>': # Добавлено условие для железной кирки
    ...

    У тебя уже есть условие для железной кирки. Оно отработает первым, и в дальнейшие ветки elif управление просто не перейдёт. Более простой пример, иллюстрирующий твою ошибку:
    x = 1
    
    if x == 0:
      print('Ноль!')
    elif x == 1:
      print('Один!')
    elif x == 2:
      print('Два!')
    elif x == 1:
      print('Раз!')

    Код выведет "Один!" а не "Раз!".
    Единственный способ добиться нужного поведения - исправить уже существующую ветку.
    x = 1
    
    if x == 0:
      print('Ноль!')
    elif x == 1:
      print('Раз!')
    elif x == 2:
      print('Два!')


    В коде вообще много спорных решений, но про них лучше отдельно поговорить.
    Ответ написан
    1 комментарий
  • Постоянно вылазит ошибка NoneType:None в чём дело?

    Vindicar
    @Vindicar
    RTFM!
    А что, по твоему, ты пытаешься сделать?
    Эта функция выводит информацию о текущем обрабатываемом исключении. А у тебя в коде исключения не выбрасываются.
    По факту, эту функцию имеет смысл использовать только когда обрабатываешь исключение, т.е. внутри блока except.
    Ответ написан
    Комментировать
  • Как описать функцию python в одном файле, а выполнить в другой?

    Vindicar
    @Vindicar
    RTFM!
    Импортируй файл MAIN до f().

    Вообще, если я верно понял ситуацию, у тебя циклическая зависимость.
    Это надо разруливать иначе.
    Например, пусть f() получает ссылку на f_from_main_file как параметр.
    Или, возможно, у тебя вообще неправильно распределены обязанности, и часть f_rom_main_file() на самом деле должна быть там же, где f().
    Ответ написан
  • Как мониторить изменение файла?

    Vindicar
    @Vindicar
    RTFM!
    Читаем документацию:
    schedule(event_handler, path, recursive=False)
    Schedules watching a path and calls appropriate methods specified in the given event handler in response to file system events.
    Parameters:
    event_handler (watchdog.events.FileSystemEventHandler or a subclass) – An event handler instance that has appropriate event handling methods which will be called by the observer in response to file system events.
    path (str) – Directory path that will be monitored.
    recursive (bool) – True if events will be emitted for sub-directories traversed recursively; False otherwise.

    Returns:
    An ObservedWatch object instance representing a watch.

    Прямо говорится что должен быть путь к каталогу.
    Просто проверяй каталог файла, указав recursive=False, а в обработчике фильтруй по имени. Только имей ввиду, что имя может иметь другой вид. Например, если я мониторю "." (текущий каталог), то имя мне приходит вида ".\test.txt". Так что pathlib в помощь, чтобы вытащть из имени нужную часть.
    Ответ написан
  • Как исправить ошибку с file.tell()?

    Vindicar
    @Vindicar
    RTFM!
    Ну раз проблема в цикле for, то вместо for line in data: делай цикл вручную, например так:
    while True:
        line = data.readline()
        if not line:
            break
        ...  # тут выполняем дальнейшие операции

    Этот код полагается на тот факт, что чтение в конце файла вернёт пустую строку (а "пустая" строка в середине файла всё равно будет иметь хотя бы один символ - символ перевода строки).
    Ответ написан
    Комментировать
  • Как параметр в лямбде соотносится с параметром в функции?

    Vindicar
    @Vindicar
    RTFM!
    Программа доходит до строки print(mydoubler(11)). Чтобы напечать результат выполнения функции mydoubler, программа вызывает эту функцию с аргументом 11, для этого программа идёт к строке mydoubler = myfunc(2).

    Ну вот тут ты уже неправ. Программа не идёт назад по коду.

    Сначала отрабатывает оператор def, определяющий функцию myfunc. После этого в текущей области видимости программы появляется переменная myfunc, хранящая ссылку на объект-функцию.
    Затем отрабатывает строка mydoubler = myfunc(2). Происходит вызов функции myfunc, при этом ей передаётся объект-число 2 как параметр. Внутри локальной области видимости myfunc теперь есть имя a, ссылающееся на объект-число 2. В ходе выполнения создаётся лямбда-функция, которая ссылается на этот параметр.
    Лямбда функция возвращается из myfunc, myfunc завершает выполнение. Поскольку лямбда-функция продолжает существовать (мы её вернули), а она ссылается на объект-число 2, то этот объект тоже продолжает существовать.
    Возвращённая функция присваивается имени mydoubler в текущей области видимости. Это позволяет её продолжать существовать (её не собирает сборщик мусора), ну и позволяет её вызвать по этому имени.

    Если бы ты сделал ещё один вызов, скажем, mytripler = myfunc(3), это бы создало новую, отдельную лямбда-функцию, совершенно независимую от mydoubler, и ссылающуюся на объект-число 3.
    Ответ написан
    1 комментарий
  • В чем может быть ошибка?

    Vindicar
    @Vindicar
    RTFM!
    Указанная тобой библиотека использует другой плейсхолдер для указания значений параметров - не ? а %s.
    Смотри пример в документации.
    Ответ написан
    Комментировать
  • Как запустить скрипт на Python с использованием сторонних библиотек?

    Vindicar
    @Vindicar
    RTFM!
    Запускай, используя python.exe из виртуального окружения.
    Ответ написан
  • Как заставить питон преобразовать значения столбца к формату?

    Vindicar
    @Vindicar
    RTFM!
    Ну т.е. у тебя два формата, по сути. Первый A-B/C/DE, где A - одна цифра, B - 4 цифры, C - 2 или 3 цифры, D - от 0 до 2 цифр, E - 2 цифры. Тебе нужно извлечь две части: A-B/C и E, и использовать их как ключ. В виде регулярки это будет что-то типа (\d-\d{4}/\d{2,3}/)\d{0,2}(\d{2}). Пример:
    import re
    r = re.compile(r'(\d-\d{4}/\d{2,3}/)\d{0,2}(\d{2})')
    m = r.match("1-2345/678/0099")
    print(m.groups())  # выведет ('1-2345/678/', '99')

    Для второго формата всё ещё проще, там будет 9 цифр подряд: (\d{9})
    import re
    r = re.compile(r'(\d{9})')
    m = r.match("123456789")
    print(m.groups())  # выведет ('123456789', )

    Как применить это к своим данным, разбирайся - я не знаю, как они представлены.
    И да, код от чатгпт лучше не брать. Он обычно не работает, и его проще переписать, чем поправить.
    Ответ написан
    2 комментария
  • Как вызвать одну функцию из другой в discord боте?

    Vindicar
    @Vindicar
    RTFM!
    Советую не пытаться удалять гланды через противоположный конец тела. А именно:
    Вместо того, чтобы пытаться вызвать обработчик команды, и биться об стенку, пытаясь имитировать всё необходимое окружение, следует просто вынести непосредственно операцию поиска в ОТДЕЛЬНУЮ функцию.
    Собственно, в твоём случае было бы норм и просто вызвать
    search_results = googlesearch.search(query, num_results=3)
    внутри ask(), и обработать полученные результаты - невелико повторение. Я бы сделал именно так.

    Если прям очень хочется сделать общий код для двух команд, вынеси в отдельную функцию и вывод:
    # Messageable - это что-то, чему можно послать текстовое сообщение. Это может быть канал, пользователь, контекст команды...
    async def search_and_reply(query: str, ctx: discord.abc.Messageable) -> None:
        try:
            search_results = googlesearch.search(query, num_results=3) 
            if search_results:
                await ctx.send("Результаты поиска в Google:")
                for result in search_results:
                    await ctx.send(result)
            else:
                await ctx.send("Ничего не найдено.")
        except Exception as e:
            await ctx.send(f"Произошла ошибка при выполнении поиска: {str(e)}")

    И тогда у тебя будет всё проще: search() будет состоять из одного вызова await search_and_reply(query, ctx), но будет брать на себя регистрацию как обработчика команды, проверку ролей и кулдаунов, и прочую мишуру, которой не место внутри search_and_reply(). Тогда ask() может просто сделать аналогичный вызов await search_and_reply(query, channel) в нужный момент, не беспокоясь о специфике дискорд-обработчика, так как search_and_reply() таковым не является.
    Ответ написан
    Комментировать
  • WebSocket connection to 'wss://localhost:12345/' failed в чем ошибка?

    Vindicar
    @Vindicar
    RTFM!
    Коннектится надо не на localhost, а на тот домен, для которого выпущен твой сертификат. Иначе обломаешься на уровне TLS-соединения (сертификат не для того домена).
    Ответ написан
  • Как из цикла for получить последовательный ответ в одну строку?

    Vindicar
    @Vindicar
    RTFM!
    Советую поучить стандартную библиотеку языка, а потом уже браться за такие вещи.
    У тебя в коде уже есть пример, как список строк превратить в одну строку, соединив их разделителем.
    spisok = "".join(llavw)
    В чём проблема адаптировать этот же метод к твоей задаче? Сформируй список из отдельных строк, потом объедини их. Единственно, стоит убедиться, что ты подаёшь на вход именно список строк, а не каких-то других объектов.
    Ответ написан
    8 комментариев
  • Ког не загрузился, как решить?

    Vindicar
    @Vindicar
    RTFM!
    Читаем документацию на класс disnake.Client, видим, что никакого атрибута cluster там нет.
    Почему ког обращается к этому атрибуту - спрашивай того, кто этот код написал.
    Ответ написан
    Комментировать
  • Ошибка при скачивании pdf-файлов, как исправить?

    Vindicar
    @Vindicar
    RTFM!
    Легко проверить. Ты делаешь:
    url = "https://file.11klasov.net/index.php?do=download&id=16985" # замените на URL файла, который вы хотите скачать
    response = requests.get(url)

    Затем посмотри атрибут response.history, и ты увидишь там два ответа: [<Response [302]>, <Response [301]>]. Все коды 3XX - это перенаправления, т.е. сайт тебя перенаправляет на другую страницу, вместо того, чтобы отдать контент.
    Итог этих перенаправлений можно узнать из response.url, который будет равен
    'https://file.11klasov.net/13938-russkij-jazyk-7-klass-razumovskaja-mm-lvova-si-kapinos-vi-i-dr.html'

    Т.е. сайт задетектил бота, и отправил тебя на страницу учебника. Так обычно борятся с хотлинкингом, когда кто-то ставит прямую ссылку на файл на твоём сайте.
    Также можно проверить response.headers['content-type']. Он будет 'text/html; charset=utf-8', т.е. это HTML страница а не PDF файл. Разумеется, если ты HTML страницу запишешь в файл с расширением .pdf, она от этого не станет валидным PDF.

    Обычно проверяются две вещи: User-Agent и Referer. Первый описывает браузер пользователя, второй - с какой страницы был переход по этой ссылке. Но для данного сайта, похоже, достаточно добавить только Referer вот так:
    response2 = requests.get(url, headers={
        'referer': response.url,  # ну или 'https://file.11klasov.net/13938-russkij-jazyk-7-klass-razumovskaja-mm-lvova-si-kapinos-vi-i-dr.html'
    })

    То получишь желаемое - response2.history будет пустой, а response2.headers['content-type'] будет равен 'application/pdf'.

    С учётом этого можешь поправить свой код, чтобы он детектил редирект и делал второй запрос с заголовком Referer.
    Ответ написан
    Комментировать
  • Как убрать символы [] () '', при выводе информации из списка?

    Vindicar
    @Vindicar
    RTFM!
    Перебирай элементы циклом for и выводи по одному, или используй str.join().
    print(', '.join(a))
    Ответ написан