Задать вопрос
  • Зачем PyCharm просит создавать пустую строку в коце?

    Vindicar
    @Vindicar
    RTFM!
    Документ PEP 8 (на который ссылается PyCharm) описывает рекомендуемую стилизацию кода на питоне. Чем единообразнее код, тем проще одному человеку будет читать код другого. И не стоит забывать, что ты сам через полгода - это всё равно что другой человек.
    Ряд инструментов позволяет автоматически проверить соответствие заданного кода стилю PEP 8, и PyCharm в их числе.
    Ответ написан
    Комментировать
  • Как извлечь эмодзи из картинки?

    Vindicar
    @Vindicar
    RTFM!
    Окей, гугл, opencv template matching.
    Когда научишься находить заранее известный эмодзи в изображении, делаешь базу эмодзи в искомом приложении и пробуешь находить их по очереди.
    Процесс можно будет ускорить, создав дерево - например, ищешь желтые кружки, если такой нашёлся с определённой степенью уверенности, только тогда ищешь желтые лица. Но это уже подробности.
    Ответ написан
    Комментировать
  • Как создать свой каскад для распознавания объектов?

    Vindicar
    @Vindicar
    RTFM!
    Я создавал лабораторную по этой теме, могу привести инструкцию.
    1. Загрузите набор утилит opencv(гугл-диск, но я советую поискать самостоятельно), в частности opencv_createsamples и opencv_traincascade, а также необходимые им DLL-библиотеки. Распакуйте их в рабочий каталог в корне диска, без русских букв и пробелов в названии. Здесь и далее предполагается, что C:\MyDirName - ваш рабочий каталог.
    2. Подготовьте фото вашего объекта. Используйте контрастный объект без движущихся частей, и желательно не дающий бликов. Для этой цели хорошо подходят логотипы.
    3. Подготовьте отрицательные примеры (не менее 100 изображений). Для этого можно снять короткое видео помещения, затем написать программу, которая разделяет это видео на отдельные кадры. Рекомендуется поместить их в отдельный подкаталог negatives.
    4. Подготовьте файлы, содержащие список файлов в этом каталоге. Их можно сгенерировать следующей парой команд в терминале:
      dir C:\MyDirName\negatives\*.jpg /B /S >C:\MyDirName\negatives\negatives_abs.txt

      dir C:\MyDirName\negatives\*.jpg /B >C:\MyDirName\negatives\negatives_rel.txt

    5. Создайте пустые подкаталоги C:\MyDirName\positives и C:\MyDirName\training. Поместите ваше изображение - положительный пример в каталог C:\MyDirName\ и назовите его positive.jpg. В качестве положительного примера желательно разместить ваш объект на светлом фоне, если он тёмный, и наоборот.
    6. Сгенерируйте положительные примеры с помощью утилиты opencv_createsamples. Команда будет выглядеть примерно следующим образом:
      C:\MyDirName\opencv_createsamples.exe -info positives\info.lst -img positive.jpg -bg negatives\negatives_rel.txt -maxxangle 0.1 -maxyangle 0.1 -maxzangle 0.1 -bgcolor 0 -bgthresh 0 -w 50 -h 50 -num 100

      Параметры:
      -info - выходной файл.
      -img - входное изображение - положительный пример
      -bg - фоновые изображения. Положительный пример будет наложен на них (в оттенках серого).
      -max?angle - допустимые углы поворота примера. Утилита выполнит перспективное преобразование примера перед наложением.
      -bgcolor и -bgthresh задают яркость (среднее и диапазон изменения) для "прозрачного цвета". Например, если ваш объект на белом фоне, задайте эти параметры равными 240 и 15 (диапазон яркости 225-255). Задав оба параметра равными 0, вы отключите эту функцию и все цвета будут непрозрачными.
      -w и -h задают минимальный размер для размещаемой копии вашего образца.
      -num - количество примеров, которые стоит генерировать. Не должно превышать количество изображений в каталоге.
      Утилита должна вывести ряд сообщений вида "Open background image", а в конце вывести "Done".
    7. Сгенерируйте vec файл следующей командой:
      C:\MyDirName\opencv_createsamples.exe -info positives\info.lst -num 100 -w 20 -h 20 -vec positives\positives.vec

      где info.lst был сгенерирован в ходе пункта 6.
      -w и -h задают минимальный размер для объекта, распознаваемого в ходе работы каскада.
      -num - количество сгенерированных примеров. Столько же, сколько и в пункте 6.
    8. Проведите обучение каскада с помощью утилиты opencv_traincascade. Команда будет иметь примерно следующий вид:
      C:\MyDirName\opencv_traincascade.exe -data training -vec positives\positives.vec -bg negatives\negatives_abs.txt -numStages 100 -numPos 100 -numNeg 100 -featureType haar -w 20 -h 20 -minHitRate 0.999 -maxFalseAlarmRate 0.4 -precalcValBufSize 4048 -precalcIdxBufSize 4048 -numThreads 24 -acceptanceRatioBreakValue 10e-5

      -data - каталог для рабочих данных, который вы создали в пункте 5.
      -vec - индекс, который был создан в пункте 7.
      -bg - файл со списком отрицательных примеров (используйте абсолютные пути!)
      -numPos и -numNeg - количество положительных примеров (пункт 6) и отрицательных примеров (пункт 3).
      -numStages - максимальное количество этапов каскада. Итоговый каскад может содержать меньшее количество этапов.
      -featureType - определяет тип признаков. Признаки Хаара обучаются медленнее, но зато более точны.
      -w и -h задают минимальный размер для объекта, распознаваемого в ходе работы каскада. Должны строго совпадать с заданными в пункте 7.
      -minHitRate и -maxFalseAlarmRate задают качество работы одного каскада.
      -acceptanceRatioBreakValue определяет момент, когда каскад перестаёт обучаться.
      -precalcValBufSize и -precalcIdxBufSize задают потребление памяти процессом.
      -numThreads определяет число рабочих потоков.
    9. По итогам обучения в каталоге training должен появиться файл cascade.xml, который можно загружать так же, как типовые каскады, поставляемые с opencv. Обратите внимание, что если вы хотите запустить обучение с начала, нужно очистить содержимое каталога training, иначе утилита будет дообучать существующий каскад.
    Ответ написан
    5 комментариев
  • Ошибка при попытке создать асинхронную функцию RuntimeWarning: coroutine 'gather_data' was never awaited?

    Vindicar
    @Vindicar
    RTFM!
    Ну если почитать внимательнее, тебе говорят в чём дело:
    File "D:\all\Programming\Парсинг\main.py", line 46, in gather_data
    pagination = int(soup.find('div', class_='pagination-wrapper').find('ul', class_='pagination-list css-1vdlgt7').find_all('li', class_='pagination-list-item')[-1].text)
    AttributeError: 'NoneType' object has no attribute 'find'

    Ты лихим кавалерийским наскоком пытаешься пройти по тегам, а какого-то из них просто нет в странице.
    Заверни код хотя бы в try-catch, и имей ввиду - сетевые операции по природе своей ненадёжны. Если сайт не твой, он может не ответить, ответить через полчаса, или прислать гоатсе вместо ответа. Так что нужно быть готовым к худшему.
    Ответ написан
  • Как использовать bot.exception_handler(telebot)?

    Vindicar
    @Vindicar
    RTFM!
    class ExHandler:
        def handle(self, error):
            print('Error: ', error)
    Ответ написан
    Комментировать
  • Не могу запустить пишет Error no such table: users?

    Vindicar
    @Vindicar
    RTFM!
    sqlite3.connect('teor.db')
    Ты уверен, что питоновский скрипт и клиент sqlite открывают один и тот же файл с базой данных?
    Ты указал относительный путь, т.е. путь относительно текущего рабочего каталога. Он может совпадать или не совпадать с каталогом, где лежит скрипт.
    На всякий случай, попробуй так:
    import pathlib, sys
    script_dir = pathlib.Path(sys.argv[0]).parent.resolve()  # путь к каталогу скрипта
    db_file = script_dir / 'teor.db'  # путь к файлу БД
    print(db_file)  # для проверки, какой файл открывается
    conn = sqlite3.connect(db_file)
    ...  # далее по тексту


    Также, попробуй убрать одинарные кавычки вокруг имени таблицы и столбцов. Они обычно нужны, если имя содержит пробелы. В твоём случае только усложняют чтение запроса.
    Ответ написан
    1 комментарий
  • Как сделать шифр на питон?

    Vindicar
    @Vindicar
    RTFM!
    str.maketrans() чтобы сделать таблицу преобразований
    str.translate() чтобы её использовать.
    Правда, этот подход работает только для преобразований "1 символ -> 1 символ".
    Если тебе нужно что-то другое, то, как написали выше, словарь в помощь.
    Ответ написан
    2 комментария
  • Можно ли в месте файл указать ссылку?

    Vindicar
    @Vindicar
    RTFM!
    Можно было чуть-чуть погуглить примеры, и почитать код, там всё написано простым английским:
    async def recognize_song(
            self, data: Union[str, pathlib.Path, bytes, bytearray, AudioSegment]
        ) -> Dict[str, Any]:
            """
            Creating a song signature based on a file and searching for this signature in the shazam
            database.
                :param data: Path to song file or bytes
                :return: Dictionary with information about the found song
            """

    Т.е. data принимает или путь к файлу, или байты с содержимым файла.
    Поэтому ответ на твой вопрос: нужно самому скачать аудиофайл по ссылке, и скачанное содержимое отдать в recognize_song().
    Если у тебя ссылка на youtube, то либо используй пакет youtubedl, либо посмотри в примерах есть что-то на тему.
    Ответ написан
    Комментировать
  • Почему бот не отправяет мне значение после функции?

    Vindicar
    @Vindicar
    RTFM!
    if i1 == proverka_slova:
    Ты сравниваешь функцию со строкой. Что ты ожидал получить-то?
    Если тебе нужен текст сообщения, обращайся к свойствам объекта message (подозреваю, нужное свойство так и называется - text).
    Ответ написан
    4 комментария
  • OSError: exception: access violation reading, ctypes, Python, что делаю не так?

    Vindicar
    @Vindicar
    RTFM!
    a = c_char_p(f'{getcwd()}\\file.txt'.encode())
    b = c_char_p(b'Help me pls')

    Тут есть проблема. Ты получаешь указатель на объект, но ты не хранишь ссылку на этот объект.
    Что, если Питон сразу же его подберёт сборщиком мусора? У тебя указатель будет указывать на адрес, где был объект, а что там сейчас - фз. Если память не будет освобождена, то обращение может быть удачным. Если страницу памяти освободят - то поймаешь access violation.
    Положи строку в переменнную, и бери указатель по переменной. Тогда объект будет жить, пока жива переменная.
    Во-всяком случае, я бы начал с этого.
    Ответ написан
    2 комментария
  • Как выполнить код после завершения потоков?

    Vindicar
    @Vindicar
    RTFM!
    t.join() дождётся завершения для одного потока t. Если нужно дождаться завершения всех трёх потоков, то можно сделать join() в цикле.
    Ответ написан
    Комментировать
  • Не знаю как сделать так чтобы скрипт обрабатывал сообщения которые приходят ко мне в ЛС, а не в группах?

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

    Vindicar
    @Vindicar
    RTFM!
    caption отдаёт только plaintext (без форматирования). Вроде как есть свойство-список caption_entities, содержащее сведения о форматировании.
    Либо попробуй указать это свойство при отправке сообщения, параметром entities = message.caption_entities, либо разбирай элементы этого списка, ищи форматирование, и вставляй его вручную (там указывается позиция в строке, где форматирование начинается/заканчивается).
    Ответ написан
    3 комментария
  • Как остановить бесконечный цикл?

    Vindicar
    @Vindicar
    RTFM!
    Последний input() должен быть вне веток if-elif-else, но внутри тела цикла.
    Ответ написан
    Комментировать
  • Как напечать треугольник в консоли?

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

    # было
         *
        ***
       *****
      *******
     ****
    *

    # верхний полутреугольник
         *
        ***
       *****
      *******
    # нижний полутреугольник
     ****
    *

    Таким образом, ты можешь по координатам вершин вычислить шаг - через сколько строк надо уменьшить/увеличить координату начального и конечного столбца. А дальше простой цикл.
    ЕМНИП, так делают видеокарты, только с пикселями.
    Шаг имеет смысл оставить дробным, чтобы избежать проблем с накапливающейся ошибкой округления.
    Ответ написан
    Комментировать
  • Как циклом Python for пройти несколько (сотен) range?

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

    Vindicar
    @Vindicar
    RTFM!
    Template matching попробуй.
    Ответ написан
    Комментировать
  • Почему IDLE и командная строка не видят модуль keyboard?

    Vindicar
    @Vindicar
    RTFM!
    keyboard - это сторонний модуль. Ты его установил через pip?
    Ответ написан
  • Создание, сохранение, проверка ключей доступа?

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

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

    Примерный путь будет:
    1. Загрузить бинарные данные из файла как bytes
    2. Расшифровать в памяти, получив исходники
    3. Использовать exec()

    Альтернативно, вместо исходников можно шифровать байткод, но тогда придётся соображать, как превратить bytes в code object, который можно выполнить через exec(). Теоретически, может помочь marshal.

    Схема не 100% надёжная, разумеется.

    А вообще, какая у тебя задача? Может, pyarmor подойдёт?
    Ответ написан
  • Можно ли узнать какая корутина вызвала ошибку в asyncio.gather?

    Vindicar
    @Vindicar
    RTFM!
    Вообще-то gather() возвращает исключения и результаты в том же порядке, в котором переданы корутины. Всегда.
    Но ты сам себе выстрелил в ногу вот этим: *{f1(), f2()}
    Ты указал литерал множества, а это не упорядоченная коллекция. Так что в каком порядке были переданы корутины - хз.
    Положи их в кортеж или в список перед отдачей в gather(), и проблема уйдёт - элемент выходного списка с индексом i будет соответствовать корутине с индексом i в исходном кортеже/списке.
    Ответ написан
    Комментировать