Ответы пользователя по тегу Python
  • Query is too old and response timeout expired or query id is invalid, как решить?

    @o5a
    Потому что answer_callback_query первым параметром принимает id, а не текст.
    await bot.answer_callback_query(callback_query.id, 'Выбери удобное время')
    Ответ написан
    4 комментария
  • SQLite + Python, как проверить есть ли данные в базе?

    @o5a
    Проще всего в цикле перебирать значения и для каждого без проверки просто запускать запрос на вставку, используя дополнительное on conflict - он позволит игнорировать команду при наличии этого значения в базе.
    for n in res:
        c.execute('INSERT INTO Zayavka(id) VALUES(?) ON CONFLICT(id) DO NOTHING', (n, ) )


    Вместо цикла можно использовать c.executemany, который сам последовательно применит команду ко всем элементам списка, но это должен быть вложенный список, где каждый элемент - набор данных для одной строки, т.е.
    res = [[40065], [40064]]
    c.executemany('INSERT INTO Zayavka(id) VALUES(?) ON CONFLICT(id) DO NOTHING', res )
    Ответ написан
    Комментировать
  • Как проверить реферальную ссылку в Telegram bot?

    @o5a
    Если речь про то, как считать передаваемые в команду аргументы, то просто разбором текста (команда по сути приходит как message.text в виде '/start 12345678').
    @bot.message_handler(commands=['start'])
    def start(message):
        # соответственно берем первый аргумент
        per = message.text.split()[1]

    Можно предусмотреть проверку на случай, если запустят команду без аргументов, например так
    args = message.text.split()[1:]
    per = args[0] if args else None
    Ответ написан
    Комментировать
  • Почему два CSV файла после удаления нескольких строк читаются по разному?

    @o5a
    Потому что надо учитывать разделители колонок. Задается параметром sep у pd.read_csv/to_csv. По умолчанию он считается запятой у этих функций, так же как и у англоязычного Excel. Но в российской версии Excel по умолчанию используется точка с запятой - ;
    Поэтому видимо изначально этот файл был с разделителем - запятой, потому правильно читались колонки через read_csv, а затем Вы пересохранили (хотя не указали, как именно "на макбуке экспортировал его как .csv") видимо в русской локали, поэтому разделителями стала точка с запятой - отсюда перестал читаться через read_csv.
    Так что указывайте тот разделитель, который реально в вашем файле, чтобы читалось правильно:
    data = pd.read_csv(sys.argv[1], sep=';')
    Ответ написан
    Комментировать
  • Как убрать всплывающее окно ссылки telegram?

    @o5a
    В send_message указать параметр
    disable_web_page_preview=True
    Ответ написан
    Комментировать
  • Почему не выдается баланс в телеграм боте?

    @o5a
    Уже много раз обсуждалось. НЕ добавляйте кавычки к названиям идентификаторов (таблиц, полей). Иначе это воспринимается как текстовая строка. Здесь например
    UPDATE 'users' SET 'balance' = ? WHERE 'chat_id' = ?
    Он будет пытаться обновить те записи, где СТРОКА 'chat_id' = какой-то там номер.
    Соответственно равны они не могут быть, и ничего не обновится.
    Не надо в запросах добавлять эти кавычки.
    Измените запрос так (и другие тоже заодно):
    self.cursor.execute("UPDATE users SET balance = ? WHERE chat_id = ?", (balance, chat_id,))
    Ответ написан
    3 комментария
  • Raise TypeError(f'the JSON object must be str, bytes or bytearray, ' TypeError: the JSON object must be str, bytes or bytearray, not int как убрать?

    @o5a
    Так определитесь, что это поле должно обозначать. В описании таблицы поле заявлено как
    trophy_road INT
    А в загрузке данных грузятся вообще противоречивые 2 строки:
    self.player.trophy_road = user_data[10]
    self.player.trophy_road = json.loads(user_data[36])

    И обе "некорректные"
    user_data[10] - это вообще другое поле в таблице, leagueReward
    json.loads(user_data[36]) - тоже не загрузится, т.к. поле не json, а INT

    Так что без подробных разбирательств для trophy_road видимо предполагалось
    self.player.trophy_road = user_data[36]
    А другое возможно в поле league_reward соответственно, но это уже лучше автору скрипта знать
    self.player.league_reward = user_data[10]
    Ответ написан
    Комментировать
  • Почему не работает код?

    @o5a
    "Работает". Только
    def log_into_steam(self):
            pass

    Функция запускается, просто ничего не делает - все, как запрограммировали.

    Учитывайте правильно отступы. Методы класса должны находиться внутри класса (по отступам), а не абы как.

    Плюс ко всему, метод инициализации пишется с двойным подчеркиванием - __init__
    Ответ написан
    Комментировать
  • Почему не копируется список внутри класса?

    @o5a
    Этим действием
    item.open_items = ['item 1', 'item 2']
    Вы не добавляете элементы к изначальному списку open_items, а перезаписываете его другим списком (объектом), поэтому ссылающиеся на изначальный список self.sorted_items_2 и т.п. так и остаются ссылаться на изначальный пустой список.
    Если бы делали так например
    item.open_items.append('item 1')
    То и ссылки бы сохранялись.
    Ответ написан
    4 комментария
  • Как декодировать строку?

    @o5a
    Похоже на двойное кодирование.
    from urllib.parse import unquote
    
    url = "%25EC%259B%2590%25EC%2597%2591%25EC%258A%25A4%25EB%25B2%25B3-%25EB%25A8%25B9%25ED%258A%2580"
    print(unquote(unquote(url)))
    Ответ написан
  • Почему код в Sublime text не работает?

    @o5a
    Sublime Text не поддерживает ввод в консоли, только вывод. Как вариант можно использовать REPL. Тема обсуждалась и на этом форуме тоже, тут например https://qna.habr.com/q/731295
    Ответ написан
    Комментировать
  • Работа с Pandas. Почему в Excel не передаются данные из db?

    @o5a
    Т.к. не задали никаких условий, то запрос
    select * from users, orders, items, commands, cats
    просто формирует кросс-соединение указанных таблиц (каждая строка каждой таблицы перемножаются друг на друга). В колонках Excel и записываются все поля всех этих таблиц.

    "только заголовки" потому что данных в таблицах нет (или не записали еще, или забыли закомитить).

    Сомневаюсь, что хотели делать кросс-соединение, так что надо указать параметры объединения таблиц, или через where .. = .. или через join
    Например так (зависит от ваших реальных связей между таблицами):
    select * from users u join orders o on u.user_id = o.user_id
    Ответ написан
  • Как правильно отсортировать список экземпляров класса через sorted по атрибуту?

    @o5a
    В стандартной sorted можно напрямую указывать функцию, которая будет использоваться в качестве критерия сортировки (параметр key). Выдаваемое этой функцией значение для каждого элемента как раз и будет использовано как значения для сортировки элементов. Также мы можем использовать lambda-функции для упрощения нашей задачи. Таким образом, мы можем напрямую указать, как сортировать наших студентов.
    Например, подобное выдаст список студентов, отсортированный по сумме оценок:
    sorted(self.students, key=lambda x: sum(x.grades))
    Аналогичным образом можете получить сортировку по средней оценке путем небольшой доработки.
    Ответ написан
    Комментировать
  • Можно ли упростить эту конструкцию try-except?

    @o5a
    while True:
      try:
        n = int(input('N = '))
        break
      except ValueError:
        pass
    print(n)
    Ответ написан
    1 комментарий
  • Как рисуются "пироги" с помощью pillow?

    @o5a
    PIL.ImageDraw.Draw.pieslice(xy, start, end, fill=None, outline=None)
    start - начальный угол в градусах (начало - на 3 часа)
    пример
    from PIL import Image, ImageDraw
    
    img = Image.new("RGB", (800, 800))
    idraw = ImageDraw.Draw(img)
    
    idraw.pieslice([10,10,200,200], start=0, end=270, fill=None, outline="yellow")
    img.show()
    Ответ написан
    Комментировать
  • Классификация вопросов?

    @o5a
    Если не нужна какая-то продвинутая система, которая анализирует разные формы слов и т.п., то самое простое - забить нужные ключевые слова или части слов, и проверять их на вхождение в строку вопроса. Например, так через regexp (проще комбинировать варианты)
    import re
    
    categories = {
        r"(время|времени|час)": "время",
        r"(зовут|имя)": "имя",
    }
    
    # тестовые вопросы
    questions = ["Сколько времени?", "Какой час?", "Время", "Как тебя зовут?", "Как твоё имя?"]
    
    for question in questions:
        for pattern, category in categories.items():
            if re.search(pattern, question, re.I):
                print(f"{question} = {category}")

    Это для примера, структуру для шаблонов можно потом уже выбрать с учетом специфики задачи.
    Ответ написан
    Комментировать
  • Почему не видно фото в окне ткинтер питон?

    @o5a
    Если ошибки не выдает, возможно по тому пути не те картинки, о которых думаете, или же они просто выходят за пределы окна (увеличьте видимое окно, чтобы увидеть). Можно сразу задать размер окна так:
    root=Tk()
    root.geometry('1000x1000')

    К тому же, насколько я вижу, предполагалось делать так, что это одна картинка (Label), которая рандомно "прыгает" по экрану? В таком случае нужно было не создавать новый Label (который будет перекрывать предыдущий), а только менять картинку на нем
    Т.е. в цикле вместо
    img=Label(image=phot)
    делать
    img.image=phot
    Ответ написан
    1 комментарий
  • Вложенный цикл_при решении, почему ошибка?

    @o5a
    Т.к. насколько понимаю цель - перебрать оба списка последовательно, подойдет zip.
    for y, a in zip(years, acres):
         # y, a соответственно будут парами год и акры, их и использовать для сравнения и записи в список acres_one_year
    Ответ написан
    Комментировать
  • При написании калькулятора на модуле kivy, вылетает ошибка, которую я напишу ниже в отдельном комментарии, ошибка вылетает при нажатии кнопки равно?

    @o5a
    Потому что указание этой функции как параметра
    gl.add_widget(Button(text='=',on_press = self.calc_result))

    подразумевает, что в нее будет передаваться объект, в котором она вызывалась (так же, как было в сложении/вычитании), поэтому она и пытается вызвать ее как self.calc_result(instance)

    Можно просто добавить его в саму функцию, даже если и не используется:
    def calc_result(self, instance):
    Ответ написан
    Комментировать
  • Как сделать умный запрос в sqllite на Python?

    @o5a
    Чтобы оно не заменяло текущее значение при передаче None, можно использовать COALESCE. В таком случае оно просто возьмет следующее значение (которое мы указываем самим полем, т.е. старым значением.
    "UPDATE users SET user_name = COALESCE(?, user_name), user_surname = COALESCE(?, user_surname), username = COALESCE(?, username), phone_number = COALESCE(?, phone_number) WHERE id = ?"

    Если же нужно учитывать таким образом передачу не только None, но и пустой строки - '', то в конструкцию надо будет добавить:
    SET user_name = COALESCE(NULLIF(?, ''), user_name),

    и аналогично для каждого поля
    Ответ написан