• Как автоматизировать подключение роутов?

    Vindicar
    @Vindicar
    RTFM!
    Можно сделать что-то в таком духе. Не супернадёжно, но сработает, пожалуй.
    from pathlib import Path
    import importlib
    import sys
    
    SCRIPT = Path(sys.argv[0]).parent.resolve()
    IMPORT_FROM = 'webhooks'
    for fpath in (SCRIPT / IMPORT_FROM).iterdir():
        # импортим .py файлы и подкаталоги c __init__.py внутри
        # игнорим __init__.py и подобное, а также файлы, начинающиеся с .
        if not fpath.stem.startswith('_') and not fpath.stem.startswith('.') and \
                ((fpath.suffix == '.py') or (fpath.is_dir() and (fpath / '__init__.py').is_file())):  
            try:
                # эквивалент import webhooks.имяфайла as module
                module = importlib.import_module(f'{IMPORT_FROM}.{fpath.stem}')
                dp.include_router(module.router)
            except Exception as err:
                print(err)  # журналируй ошибку
    Ответ написан
  • Как мониторить изменение файла?

    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 в помощь, чтобы вытащть из имени нужную часть.
    Ответ написан
  • Как обойти cloudflare про использовании requests?

    Vindicar
    @Vindicar
    RTFM!
    Смотря как организована защита. Если проверяются возможности браузера - то никак, разве что искать прокси, на который cloudflare агриться не будет... что маловероятно.
    Ответ написан
    Комментировать
  • Какие ограничения есть на ip адреса для SSH?

    Vindicar
    @Vindicar
    RTFM!
    Часть IPv4 адресов (точнее, целые подсети) зарезервирована для локальных сетей и подобных целей - т.н. приватные адреса (private subnets). Они не доступны "снаружи", из Интернета, а только если ты находишься в той же сети.
    Какие именно - гугл и википедия знают.

    А "скорее всего" - даже если IP адрес публичный, не значит, что этот адрес соответствует реальному узлу. А если соответствует, не факт, что на узле поднят SSH сервер.
    Ответ написан
    Комментировать
  • Проверка сообщений пользователей Aiogram?

    Vindicar
    @Vindicar
    RTFM!
    Код не имеет смысла.
    @dp.message_handler(text=['Найти группу'])
    async def group(message):

    Вы просите бота вызвать функцию group(), если он получит сообщение с текстом 'Найти группу' (точное совпадение).
    Поэтому message.text в рамках этого обработчика будет равен именно 'Найти группу' и более ничему - ни '6', ни '7'.
    Ответ написан
    Комментировать
  • Как преоброзовать фото в видео (moviepy)?

    Vindicar
    @Vindicar
    RTFM!
    ImageClip чтобы интерпретировать изображение как статичное видео.
    VideoFileClip чтобы загрузить видео.
    CompositeVideoClips чтобы наложить два или более клипов. Потом метод write_videofile(), чтобы сохранить результат.

    Научись работать с одним клипом и изображением. Потом оформи этот код в функцию вида
    def process_one(image_path, input_video_path, output_video_path) -> None:

    чтобы она брала указанную картинку и видео, и сохраняла результат в указанный файл.

    Дальше уже будет просто вопрос вызова этой функции с правильными именами файлов. Тут пригодится, скажем, стандартный модуль pathlib, в частности метод Path.glob().

    Десять минут работы с документацией, и всё можно найти.
    Ответ написан
    Комментировать
  • Как исправить ошибку с 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!
    Любой редактор, умеющий диаграмму состояний UML, подойдёт. Хоть diagrams.net (бывший draw.io).
    Ответ написан
    Комментировать
  • Как поставить временное ограничение на использование команд в ТГ боте на python?

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

    Vindicar
    @Vindicar
    RTFM!
    Ну так сначала сформируй желаемый текст в переменной, а потом уже редактируй сообщение.
    Метод str.join() в помощь.
    Ответ написан
    Комментировать
  • У бота такая ошибка, что делать?

    Vindicar
    @Vindicar
    RTFM!
    Почему ты вообще запускапешь файл .yml? Это же файл конфигурации в YAML формате, а не код на питоне.
    Ответ написан
    3 комментария
  • В чем может быть ошибка?

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

    Vindicar
    @Vindicar
    RTFM!
    Документация советует run_coroutine_threadsafe(). Эта функция позволяет запланировать вызов корутины с параметрами (читай, эквивалент await вызова) в рамках рабочего цикла (loop) asyncio, который крутится в другом потоке. С полученным future можно что-то сделать, например, подождать, пока оно реализуется. Пример по ссылке.
    Ответ написан
    Комментировать
  • Как запустить скрипт на 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 комментария
  • Что посоветуете по GUI для питона?

    Vindicar
    @Vindicar
    RTFM!
    Посмотри в сторону kivy.
    wxWidgets и tkinter лучше подходят для мелких программ, имхо.
    Ответ написан
    Комментировать
  • Как удалить уникальные дубли?

    Vindicar
    @Vindicar
    RTFM!
    Ну слушай, если пишут совсем кто как, то ничего не поделаешь. Как ты определишь, вариантом названия какой компании является текущее?

    Да, можно использовать расстояние Левенштейна для поиска наиболее похожих строк, но и тогда нет гарантий, что пользователь не извратит название достаточно сильно.
    Можно использовать регулярки из модуля re, но их придётся для каждой компании составлять вручную.

    По хорошему-то вообще не стоит использовать названия как идентификатор, особенно вводимые пользователем. Но это скорее совет на будущее.
    Ответ написан
    Комментировать
  • Как корректно использовать селектор при парсинге сайта?

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

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

    Во-вторых, современные сайты - это не статические странички аля 1991й год. Они зачастую битком набиты JS-скриптами, которые исполняются в среде браузера. Поэтому нередко сайт отдаёт страницу-заглушку, на которую средствами скрипта уже подгружается контент. BeautifulSoup не исполняет JS, это не его задача, а потому ты увидишь только заглушку, и больше ничего.
    Ответ написан
    3 комментария