Ответы пользователя по тегу Python
  • Добавление аргументов к функции с threading?

    Vindicar
    @Vindicar
    RTFM!
    1. На момент вызова конструктора Thread переменная conn ещё не существует. Тебе нужно создавать поток тогда, когда она уже получила значение.
    2. Не вызывай метод run(). Он будет вызван сам, в отдельном потоке. Для запуска этого потока нужно вызвать start(). И имей ввиду, что у тебя send() отрабатывает однажды, и останавливается.

    Я бы посоветовал попрактиковаться в работе с потоками, для начала.
    Ответ написан
    Комментировать
  • Лаконичный код, для нуба на Python =/ _main_, _name_?

    Vindicar
    @Vindicar
    RTFM!
    Это несложно, на самом деле.
    Когда ты делаешь import module_name, Питон ищет либо файл module_name.py, либо пакет module_name. Про пакеты пока говорить не будем. Если такой файл нашелся, и он ещё не был импортирован, то он выполняется в контексте импортирующего скрипта. При этом получается объект-модуль, и ссылка на него помещается в переменную module_name в импортирующем скрипте.
    Пример:
    # a.py
    def somefunc():
        print('Hi!')
    
    print('a is executed')
    
    # b.py
    import a  # >>> a is executed
    a.somefunc()  # >>> Hi!

    Имя, под которым импортируется модуль, помещается в переменную __name__. Изменим код так:
    # a.py
    def somefunc():
        print('Hi!')
    
    print(__name__, 'is executed')
    
    # b.py
    import a  # >>> a is executed
    a.somefunc()  # >>> Hi!
    print('And I am', __name__)  # >>> And I am __main__

    Таким образом, мы видим, что для исполняемого скрипта переменная __name__ содержит строку "__main__", а импортируемые скрипты увидят в ней только своё имя. Причем неважно, если ты переименуешь модуль:
    # a.py
    def somefunc():
        print('Hi!')
    
    print(__name__, 'is executed')
    
    # b.py
    # импортируем модуль и переименовываем его
    import a as d  # >>> a is executed
    d.somefunc()  # >>> Hi!
    print('And I am', __name__)  # >>> And I am __main__

    Именно эта особенность и позволяет писать код, который выполнится только если питон-скрипт выполняется непосредственно.
    # a.py
    # Этот код выполнится в любом случае
    def somefunc():
        print('Hi!')
    
    if __name__ == '__main__':
        # этот код выполнится только если a выполняется непосредственно
        print(__name__, 'is executed') # Всегда выведет __main__ is executed
    else:
        # а этот код выполнится только если a импортируется в другой модуль
        print('Imported as', __name__)
    # b.py
    import a  # >>> Imported as a
    a.somefunc()  # >>> Hi!
    print('And I am', __name__)  # >>> And I am __main__
    Ответ написан
    1 комментарий
  • Что делать: ValueError: I/O operation on closed file?

    Vindicar
    @Vindicar
    RTFM!
    Не используй with для таких вещей, просто
    file = open('avatar/' + f'{idfot1}', 'rb')
    Иначе with закроет файл до того как бот успеет подхватить его содержимое.
    Лучше вызови file.close() вручную в конце.
    Ответ написан
    Комментировать
  • Почему удаляются не все объеты класса Int?

    Vindicar
    @Vindicar
    RTFM!
    ['a', 1, 2, 'c']
    После того как ты удалил 1, 2 встанет на его место. Но этот элемент уже был обработан, и цикл пойдёт дальше, к 'c'.
    Если тебе нужно удалять элементы из списка в процессе итерации, итерируйся начиная с конца. Тогда будет меняться только позиция уже обработанных элементов.
    И делай итерацию не напрямую по списку, а по индексу.
    Ответ написан
  • Как запустить фоновую задачу?

    Vindicar
    @Vindicar
    RTFM!
    Когда ты делаешь await, ты говоришь "останови работу данной корутины, дождись, пока не закончится операция после await, потом продолжи работу". Пока одна корутина остановлена, другие могут выполняться. В общем, почитай про то, как работает асинхронная программа.
    Если тебе нужно запустить корутину, не дожидаясь её завершения, asyncio.create_task() в помощь.

    Стоит понимать, что код, который ты запускаешь через asyncio.create_task(), должен тоже быть асинхронный! Если ты завернёшь обычный синхронный вызов в корутину, и запустишь её через create_task(), чуда не будет - бот всё равно встанет колом, пока вызов не закончится.
    Так что взгляни лучше на свой парсер - если он основан на синхронной библиотеке типа requests, перепиши его на aiohttp.
    Ответ написан
  • Телеграм бот + веб сервер, что использовать?

    Vindicar
    @Vindicar
    RTFM!
    И боту и Flask нужен вечный цикл для работы. Так что либо разноси их по разным потокам, либо разноси их по разным процессам (т.е. по разным скриптам).
    Ответ написан
  • Как получить список всех пользователей на сервере Discord?

    Vindicar
    @Vindicar
    RTFM!
    Клиент - это твой бот. Если почитать немножко поглубже, найдешь описание класса 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.

    Очень частая ошибка - пытаться работать одновременно с экземпляром Client и экземпляром Bot. Это просто не нужно.
    Ответ написан
  • Python. Как отсортировать двухмерный список?

    Vindicar
    @Vindicar
    RTFM!
    Если j == __COLS - 1, но i < __ROWS - 1, то ты попытаешься обратиться к элементу a[i][__COLS - 1 + 1], т.е. a[i][__COLS]. Я полагаю, в этом и дело.
    Не знаю насчёт Java, но в C++ вполне возможно, что у тебя строки матрицы лежат в памяти подряд, так что ты фактически нечаянно обращаешься к a[i+1][0], тем самым корректно "склеивая" строки.
    Ответ написан
  • Можно ли создавать экземпляры класса внутри самого класса?

    Vindicar
    @Vindicar
    RTFM!
    Это вопрос сцепления классов.
    Если ты внесешь это в метод класса, то теперь класс должен знать о коллекции humans, и, что ещё хуже, об информации в объекте settings. Нужно ли ему это знание для выполнения своих основных обязанностей? Если нет, делать эту операцию методом класса не имеет особого смысла.
    И я бы сказал, это слишком тривиально, чтобы вытаскивать в метод.
    Ответ написан
  • Ошибка PermissionError: [Errno 13] Permission denied при попытке редактирования файла .xlsx во время его использования. Как решить?

    Vindicar
    @Vindicar
    RTFM!
    Святослав Смирнов, никак, Эксель требует эксклюзивного доступа к файлу.
    Если нельзя закрыть его на время обновления файла, твой единственный вариант - достучаться до экселя через COM-автоматизацию, натйи окно, где открыт этот файл и заставить его изменить значения в ячейках. Это гемморой, прямо скажем.
    Ответ написан
    Комментировать
  • Сортировка файлов по части имени + формат на Python?

    Vindicar
    @Vindicar
    RTFM!
    Можно сделать обобщённое решение. Описываешь функцию преобразования, которая имя файла превращает в относительный путь к файлу.
    from os import path
    
    def get_folder(fname: str) -> str:
        ... # тут будет код
    
    base_folder = r'C:\тут\корневой\каталог\куда\складывать\файлы'
    for file in files: #перебираешь список файлов, у тебя этот код уже есть
        subpath = get_folder(path.basename(file))
        if subpath is None: # если функция вернула None, игнорируем файл
            continue
        source_path = path.abspath(file)
        target_path = path.join(base_folder, subpath)
        # и переносишь/копируешь файл из source_path в target_path


    Хорошо, а как реализовать get_folder()?
    Описываешь имя файла регуляркой, например, такого вида:\w+?(?P<Num>\d+)\.(?P<Ext>\w+)
    Как видим, эта регулярка содержит две именованных захватываемых группы - цифры перед точкой Num, и расширение Ext.
    Если тебе хватит точного совпадения, и не требуется делать что-то вида "файлы с цифрами 000-100 в папку 100", то реализация будет примерно такая:
    import re
    NAME = re.compile(r'\w+?(?P<Num>\d+)\.(?P<Ext>\w+)', re.I)
    TYPES = { #сортировка по типам
        'aac': 'AUDIO',
        'mp4': 'VIDEO',
        'jpg': 'IMAGES',
        None: 'MISC', #всё остальное
    }
    
    def get_folder(fname: str) -> str:
        m = NAME.match(fname) #пусть имя файла anything100.jpg
        if m is None: #имя файла не по шаблону - непонятно что делать с файлом
            return None # или говорим "не трогай файл"
            #return f'{TYPES[None]}/{fname}' # или кидаем в папку для неразобранного
        data = m.groupdict() # data = { 'Num': '100', 'Ext': 'jpg' }
        data['File'] = fname # data = { 'Num': '100', 'Ext': 'jpg', 'File': 'anything100.jpg' }
        data['Type'] = TYPES.get(data['Ext'].lower(), TYPES[None]) # data = { 'Num': '100', 'Ext': 'jpg', 'File': 'anything100.jpg' , 'Type': 'IMAGES' }
        return '{Type}/{Type}{Num}/{File}'.format(**data) # IMAGES/IMAGES100/anything100.jpg

    Дальше подгонишь как тебе надо, меняя реализацию get_folder().
    Ответ написан
    Комментировать
  • Python телеграм бот база данных sql?

    Vindicar
    @Vindicar
    RTFM!
    Боюсь, совет тут будет "поучиться программированию и работе с базами данных в целом". Вот кроме шуток.
    1. Зачем проходиться по базе циклом, если можно написать простейшей SELECT с фильтрацией блоком WHERE?
    2. Зачем объявлять бота и обработчик событий внутри этого цикла? У вас выживет только последняя копия для последней строки.

    Короче, итоговый код должен иметь приблизительно такой вид:
    @bot.message_handler()  
    def start(message):
        cursor = connection.cursor()
        row = cursor.execute('SELECT фамилия FROM OPCFIO WHERE имя = %s LIMIT 1', (message.text,) ).fetchone()
        if row is None:
            # не нашли фамилию, реакцию на это пропиши сам
        else:
            last_name = row[0] # нашли, она лежит в last_name, делаем с ней что нужно

    И НИКАКОГО ЦИКЛА ПО ВСЕЙ БД.
    Ответ написан
    2 комментария
  • Как наиболее эффективно прочитать и работать с большим csv в Python?

    Vindicar
    @Vindicar
    RTFM!
    Не очень ясно, какие столбцы идентифицируют объект недвижимости в файле. GUID, похоже, относится к факту купли-продажи. Так что поясни, на что смотреть.

    Я бы прочитал файл построчно, выбирая Postcode и подсчитывая количество тех или иных значений. Будет объёмно, но уж точно не 20 гигов. Затем посмотрел бы на гистограмму - много ли уникальных Postcode (т.е. тех, которые встречают один раз). Если много, то тогда достаточно посмотреть только на те Postcode, которые встречаются неоднократно. Это позволит уменьшить размер файла. В дальнейшем его можно фильтровать дальше по той же схеме, но с другими полями.
    Ответ написан
  • Почему python не видит модуль?

    Vindicar
    @Vindicar
    RTFM!
    Проекты в PyCharm могут использовать системный интерпретатор, или виртуальное окружение (отдельную копию интерпретатора для проекта). Соответственно модули, установленные в одном, другой не увидит.
    Проверь, что используешь, и куда ставишь.
    Ну и да, имена устанавливаемых пакетов и импортируемых модулей в студию. Может, у тебя просто опечатка в импорте.
    Ответ написан
    3 комментария
  • Как определять движение в движущейся камере python?

    Vindicar
    @Vindicar
    RTFM!
    В общем и целом решения нет, так как отличить движение объекта от эффекта параллакса затруднительно, да и опираться на координаты тоже будет проблематично.
    Ты можешь поэкспериментировать с оптическим потоком, чтобы попытаться понять, в каком направлении сместилась камера, и пытаться либо произвести контр-смещение кадра перед использованием mean of gaussians, либо отсеивать объекты, у которых величина собственного смещения слишком близка к найденному движению камеры (со знаком минус). Первое реально работает только при съёмке с рук стоящего человека, т.е. когда смещения сравнительно малы. Если нужно ловить движение, когда камера тоже движется в одном направлении, шансов очень мало.
    Так или иначе, тебе наверняка придётся самому реализовывать тот или иной алгоритм background subtraction, чтобы иметь возможность вмешаться в его работу для компенсации движения.
    Ответ написан
    1 комментарий
  • Как печатать текст перед input() в Python?

    Vindicar
    @Vindicar
    RTFM!
    Либо очищать терминал и перевыводить содержимое, либо использовать ncurses (но это только под линукс, под винду нужно искать тот или иной порт).
    Ответ написан
    Комментировать
  • Как полученную переменную конвертировать в числовую?

    Vindicar
    @Vindicar
    RTFM!
    Приведённый код должен работать, по идее. Приведи пример входных данных, вызывающих ошибку, и полный текст этой ошибки.

    Исходя из преобразования во float, могу разве что предположить что ты вводишь число с десятичной запятой ("2,3") а не с десятичной точкой ("2.3").
    Ответ написан
    9 комментариев
  • Как оптимизировать работу приложения?

    Vindicar
    @Vindicar
    RTFM!
    Вместо цикла и win.update() научись использовать win.after().
    Ответ написан
    2 комментария
  • Как спарсить сайт, чтобы парсер работал под моим аккаунтом?

    Vindicar
    @Vindicar
    RTFM!
    Почти наверняка сайт использует cookies для хранения сессии, т.е. чтобы понять, что два или более запроса пришли от одного и того же пользователя.
    Большинство библиотек для работы с HTTP предоставляют механизм хранения cookies. Та же requests, например.
    Тогда выясняешь, какой запрос нужно сделать к сайту, чтобы залогиниться, и делаешь этот запрос. Потом в рамках той же сессии (читай документацию на используемую библиотеку!) выполняешь нужные тебе запросы к страницам.
    Ответ написан
    Комментировать
  • Как сделать так, чтобы без выполнения @dp.message_handler(commands='Висельница') - start_game() не выполнялась @dp.message_handler()-game?

    Vindicar
    @Vindicar
    RTFM!
    Это называется машина состояний. Упрощённо, тебе нужно хранить для каждого участника сведения о том, играет он или нет. Например, словарь, где ключ - ID участника а значение - состояние игры. Если ID нет в словаре, то участник не играет.
    Решение Kvason плохо тем, что оно работает только для одного собеседника, т.е. либо все играют, либо никто не играет.
    Ответ написан
    1 комментарий