Задать вопрос
Ответы пользователя по тегу Python
  • Как достать и отправить все строки в Telegram-боте, включающие в себя одну из переменных в базе данных?

    @o5a
    В result содержится вложенный список со всеми полями данных таблицы. Примерно так:
    [(ряд1значение1, ряд1значение2, ...), (ряд2значение1, ряд2значение2, ...), ...]
    Чтобы использовать join нужно сначала сформировать из всех значений ряда текст, чтобы получилось вида
    [строка_ряда1, строка_ряда2, ... ]
    тогда уже можно будет сделать '\n'.join()

    Если все еще не понятно, вот пример из недавних ответов.
    Ответ написан
    Комментировать
  • Как получить значения после сообщения?

    @o5a
    Все данные в message.text. Разрезайте по split и берите, что нужно
    Соответственно для того случая "отправить евро 500" нужно взять все, кроме первого элемента
    currency, amount = message.text.split()[1:]
    Только стоит добавить проверки (в зависимости от запланированной логики работы) на случай, если параметры не будут указаны.

    Еще в aiogram есть свой метод, message.get_args() возвращающий строку аргументов, но он вернет строку, которую тоже надо будет разрезать split()
    Ответ написан
    Комментировать
  • Почему не работает sql запрос в условиях?

    @o5a
    После изменения данных нужно делать
    connection.commit()
    Ответ написан
    Комментировать
  • Как правильно прочитать файл с сохранением типов данных?

    @o5a
    Если структура всегда примерно такая, то можно через ast
    from ast import literal_eval
    
    s = "0:[2,4,5]"
    data = literal_eval(f"{{{s}}}")
    print(data)
    # {0: [2, 4, 5]}
    Ответ написан
    Комментировать
  • Как добавить несколько словарей в CSV (Python)?

    @o5a
    list1 = ['from=<test@yandex.ru>', 'from=<test2@yandex.ru>', 'tes23@yandex.ru', 'test@yandex.ru', ]
    list2 = ['to=<test@yandex.ru>', 'to=<test2@yandex.ru>', 'to=<tes23@yandex.ru>',  ]
    # сформировать сколько нужно словарей по списку
    counters = [Counter(x) for x in [list1, list2]]
    
    with open('outputTest.csv', 'w') as csvFile:
        writer = csv.writer(csvFile)
        header = ['email_from', 'quantity' 'email_to', 'quantity']
        writer.writerow(header)
        for counter in counters:
            for item, cnt in counter.items():
                writer.writerow((item, cnt))

    Или можно изначально не создавать Counter, а делать уже внутри нижнего цикла.
    Или же можно все списки изначально сложить в один и сделать все через единственный Counter.
    Ответ написан
    Комментировать
  • Ошибка при запросе на добавление строки в mysql?

    @o5a
    Для подстановки в mysql вместо ? используйте %s
    И количество знаков подстановки должно совпадать с количеством самих элементов в data_insert.
    Ответ написан
    Комментировать
  • Как отдельно вывести каждое значение из бд?

    @o5a
    Результат выполнения select в курсоре, как и fetchall() выдает не просто кортеж, а вложенный кортеж, т.е.
    ((ряд1значение1, ряд1значение2, ряд1значение3... ), (ряд2значение1, ряд2значение2, ряд2значение3... ), ...)

    соответственно нужно дополнительно join складывать значения ряда в строку, а затем строки рядов в строку.
    result2 = '\n'.join(' ║ '.join(f'{val}' for val in row) for row in cur.execute(f"SELECT * FROM {arg}"))

    А если нужно, чтобы это было выровнено, то можно сначала считать данные, затем вычислить в каждом столбце самое длинное значение, и затем уже вывести, отформатировав по наибольшему.
    Ответ написан
    1 комментарий
  • Как исправить sqlite3.IntegrityError: NOT NULL constraint failed?

    @o5a
    В таблице поля объявлены обязательными (нельзя вставить NULL), что в целом нормально. Но при этом нельзя заносить данные постепенно, нужно делать INSERT один раз в самом конце, когда все данные от пользователя получили, т.е. в функции patronymic.
    def patronymic(message): #получаем отчества
        ...
        cursor.execute("INSERT INTO Profile (user_id, name, surname, patronymic) VALUES (?, ?, ?, ?)", (user_id, name, surname, patronymic))
    Ответ написан
    5 комментариев
  • Как записать данные в бд?

    @o5a
    Добавить ограничение по уникальности этого поля, затем при добавлении записи можно будет при возникновении конфликта (дублировании записей) автоматически пропустить добавление. Конкретный формат зависит от базы данных. Для sqlite:
    добавить unique(имя поля) в создание таблицы
    create table mytable (id integer primary key,
    user_id integer,
    ....,
    unique(user_id)
    )

    затем при вставке данных
    INSERT INTO mytable (user_id, user_name) VALUES (...) ON CONFLICT(user_id) DO NOTHING


    Можно и более костыльный вариант. Перед вставкой данных делать запрос
    result = cur.execute('select 1 from mytable where user_id = ?), (user_id, )).fetchone()
    if not result:
       # делаем insert
    Ответ написан
    Комментировать
  • Как конвертировать секунды с миллисекундами в часы и минуты?

    @o5a
    Проще использовать datetime.timedelta
    ...
    t2 = time.time() 
    delta = t2-tdict[member.id]
    print(datetime.timedelta(seconds=delta))
    Ответ написан
  • Как добавить число к числу из бд sqlite?

    @o5a
    number = # на сколько нужно увеличить то число
    cur.execute("UPDATE users SET number = number + ? WHERE user_id = ?", (number, user_id))
    Ответ написан
    7 комментариев
  • Как боту aiogram вывести число из бд sqlite?

    @o5a
    В функции exists_user как раз правильно составлен запрос на выбор конкретного пользователя (с использованием WHERE).
    Аналогично должен быть составлен и запрос в функции number. В текущем виде тот запрос выбирает всех подряд.
    Для передачи самого номера пользователя в команду нужно достать его из параметров:
    async def number(message: types.Message):
        num = message.get_args()
    Ответ написан
    5 комментариев
  • FetchAll, как вывести значение из MySql и занести в переменную (AioMysql, PyMysql)?

    @o5a
    Для передачи параметров нужно использовать кортеж. Просто добавление скобок к значению не делает его кортежем, нужно добавить запятую: (id, )
    Судя по запросу, требуется только одно значение, поэтому можно использовать fetchone (возвращает первую строку резульата).
    await cur.execute("SELECT `user_id` FROM `admins` WHERE id = %s", (id, ))
    sql = cur.fetchone()
    if sql:
        user_id = sql[0]
        print(user_id)
    Ответ написан
    Комментировать
  • Бот не отвечает на команды?

    @o5a
    Потому что это обработчик уже пришедшего текста ("БОНУС" и т.п.). А кнопки нужно вставить в обработчик команды /start
    @bot.message_handler(commands=['start'])
    def start(message):
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        butt_1 = types.KeyboardButton("ПОЛУЧИТЬ ДЕНЬГИ")
        butt_2 = types.KeyboardButton("БОНУС")
        markup.add(butt_1, butt_2)
    
        bot.send_message(message.chat.id, "Чё надо?", reply_markup=markup)
    Ответ написан
  • Как вообще понимать декораторы в Python?

    @o5a
    Дальше у меня возник вопрос и ступор - мы почему то возвращаем не результат выполнения функции wrapper, а возвращаем саму функцию-объект.

    Так и есть. Нам же не нужно в самом декораторе вызывать функцию, а только указать, какую функцию мы используем. Без скобок () это просто ссылка на сам объект (функцию).
    Пример:
    def f1(): return 1
    
    a = f1() # присваиваем результат работы функции, т.е. в a будет 1
    a = f1 # присваиваем саму функцию
    # тогда a - это не результат работы функции f1, а сама функция f1
    # и мы можем ее запустить
    print(a() ) # выведет 1, т.к. мы через a запустили f1

    Декораторы так и делают. Создают функцию и возвращают ее, но не запускают. А запускается эта "обертка" во время запуска нашей основной функции.
    Т.е. когда добавляется декоратор
    @uppercase
    def greet(): ...
    # то когда мы запускаем функцию
    greet()
    # по факту запускается
    uppercase(greet)()

    Но что возвращает uppercase(greet) ? Смотрим по коду. А возвращает она некий wrapper. Что делает wrapper?
    original_result = func() # запускает переданную ему функцию на исполнение, в нашем случае greet
    return f'Большие {original_result.upper()}' # и возвращает строку с результатами исполнения

    И она сама каким-то образом вызывается и выполняется, хоть мы и явно не пишем это.

    Исполняется потому, что запуск декорированной функции означает запуск
    uppercase(greet)()
    а т.к. uppercase(greet) возвращает wrapper
    то uppercase(greet)() запускает wrapper()
    Ответ написан
    Комментировать
  • Почему не работает команда INSERT INTO в моём коде?

    @o5a
    Сама команда добавления работает. Но
    1. Проверка наличия пользователя в базе неправильная. Можно так
    if cursor.execute(f"SELECT username FROM users WHERE username = ?", (username, )).fetchone(): #Если такой пользователь уже есть

    2. fetchone возвращает только первую запись, поэтому остальных не видите при выводе "всю таблицу с username-ми", есть fetchall.
    3. исключения лучше не гасить совсем, иначе и будет "ошибок нет, но ничего не работает". Лучше их выводить или логировать.
    except Exception as e:
        print('ошибка:', e)
        return False
    Ответ написан
    1 комментарий
  • Выдает ошибку, не знаю что делать ( создаю бота Дискорд по экономике ), что делать?

    @o5a
    Ошибка указывает на то, что запрос из базы не возвращает данных. Т.е. по данному id пользователя в таблице не нашлось.
    Ответ написан
  • Как получить информацию из объекта класса через словарь?

    @o5a
    Вместо PrintInformation сделать по логике просто возврат самого объекта студента
    ...
        def GetStudent(self, _id):
            return self.Handler[_id]

    добавить те же Exception, если нужно.
    А если нужно текстовое представление, добавить метод __repr__ с нужным отображением в сам класс студента.
    Ответ написан
    Комментировать
  • Ограничение ввода данных в переменную?

    @o5a
    Проверку нужно до перевода в число делать, плюс добавить проверку на само число (или отсутствие букв, по желанию)
    async def process_start_command(message: types.Message):
        number1 = message.text.split()[1]
        if not (number1.isdigit() and 1 <= int(number1) <= 1000):
        	await message.answer(f'введите число меньше 1000')
        else:
            random_number = random.randint(0, int(number1))

    И кстати random.randint(0, x) выдаст число из x+1 набора чисел, а не x.
    Ответ написан