Задать вопрос
Ответы пользователя по тегу Python
  • Корзина из баз данных в телеграм боте?

    Vindicar
    @Vindicar
    RTFM!
    Ну если есть актуальная таблица товаров, то корзиной будет таблица вида "ID пользователя - ID товара - Количество". Тогда при выборе товара вписываете ID пользователя, который отправил сообщение. Ну а чтобы показать корзину пользователя, просто фильтруете по ID пользователя, от которого пришел запрос.
    Ответ написан
    Комментировать
  • Почему не присваивается реакция в переменную?

    Vindicar
    @Vindicar
    RTFM!
    Ну во-первых, ты добавляешь реакцию к одному сообщению, а смотришь у другого.
    ctx.channel.last_message может и не совпадать с сообщением startMes, если за время простановки реакции в канал было отправлено ещё одно сообщение.
    Во-вторых, discord.py много чего кэширует. Список reactions может обновиться не сразу.
    В-третьих, а зачем тебе смотреть список реакций сразу после вывода сообщения? Вряд ли кто-то успеет проставить свою.
    Ответ написан
    Комментировать
  • Не устанавливается модуль discord.py,что делать?

    Vindicar
    @Vindicar
    RTFM!
    SuperDuperPuperTurbo, засунь в ошибку в переводчик, и поймешь.
    Тебе нужна версия питона 3.6 или старше. Посмотри, какая у тебя, и поставь нужную. Сейчас вроде 3.10 вышла, но если у тебя windows 7 или более ранняя ось, то самая поздняя будет 3.8.
    И да, если в питоне чайник, то сначала поучи питон, хотя бы почитай Марк Лутц, "Изучаем Питон", а потом уже хватайся за ботов. Боты - это не так просто, как говорят.
    Ответ написан
    Комментировать
  • Как создать файл в python еще до завершения программы?

    Vindicar
    @Vindicar
    RTFM!
    Файл должен создаться сразу, как только отработает open().
    Если ты замеряешь "время создания" по времени появления файла в проводнике, имей ввиду, что у проводника реакция отнюдь не мгновенная.
    Ответ написан
  • Поместить содержимое файла в переменную в python?

    Vindicar
    @Vindicar
    RTFM!
    Читай документацию, там это есть. Ну и или на русском.

    А вот теперь расскажи, почему ты не мог вбить в гугл "питон прочитать содержимое файла" и прокликать первые несколько ссылок...
    Ответ написан
    6 комментариев
  • Как работают срезы в массиве?

    Vindicar
    @Vindicar
    RTFM!
    Чтение среза и присваивание срезу - это разные вещи. Копия создаётся только при чтении.
    Ответ написан
    3 комментария
  • Json файл возвращает null как исправить это?

    Vindicar
    @Vindicar
    RTFM!
    Выражение response.text ничего не сделает.
    Если ты хочешь, чтобы функция gen() вернула содержимое ответа, используй ключевое слово return.
    return response.text
    или
    return response.json()
    смотря что тебе нужно
    Ответ написан
    Комментировать
  • Socket.gaierror: [Errno 11003] getaddrinfo failed, что делать?

    Vindicar
    @Vindicar
    RTFM!
    Что-то мне подсказывает, что вместо email нужно указывать адрес SMTP сервера.
    Ответ написан
    Комментировать
  • Добавление аргументов к функции с 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 комментария