• Как в таблицу SQL pypyodbc ввести данные?

    @o5a
    добавлял оценку в существующую строчку

    в SQL называется UPDATE
    mySQLQuery = (f'''update dbo.rating set `{subject}` = {appr} where id = '{your_id}')''')

    а лучше через передачу параметров
    mySQLQuery = f'''update dbo.rating set `{subject}` = %s where id = %s'''
    cursor.execute(mySQLQuery, (appr, your_id))
    Ответ написан
    Комментировать
  • Как решить задачу правильно?

    @o5a
    Подобная задача проще всего решается через стэк.
    Перебираем постепенно элементы исходного списка.
    Если последний элемент стэка равен противоположному (NORTH-SOUTH и т.п.) текущего элемента списка, то удаляем (stack.pop()) этот элемент из стэка. В противном случае добавляем к стэку. В конце цикла в стэке останется только неисключенные элементы (без пар). Для соответствия пар можно задать словарь.
    Примерно так (спрячу под спойлер, на случай если захочется реализовать самостоятельно):
    spoiler
    def dirReduc(arr):
        dirs = {"NORTH": "SOUTH", "SOUTH": "NORTH", "EAST": "WEST", "WEST": "EAST"}
        stack = []
        for d in arr:
            if stack and dirs[d] == stack[-1]:
                stack.pop()
            else:
                stack.append(d)
        return stack
    Ответ написан
    1 комментарий
  • Как в python pygame как сделать чтобы объект поворачивался до курсора мыши?

    @o5a
    Проблем 2.
    1. Вращать нужно оригинал изображения, а не уже измененную предыдущем вращением копию. Из-за этого будет забиваться память, и скорее всего поэтому он
    иногда еле-ели вертится!)

    Т.е. сменить примерно так:
    bmp_дерево_rot = pygame.transform.rotate(bmp_дерево, rotate(bmp_image))
    bmp_image = bmp_дерево_rot.get_rect(center=(150, 700))
    sc.blit(bmp_дерево_rot, bmp_image)

    2. Для расчета угла вращения нужно помимо координат мыши указывать и правильные координаты самой картинки, а не 0,0.
    def rotate(oject2):
        mouse_x, mouse_y = pygame.mouse.get_pos()
        x, y = bmp_image.center
        rel_x, rel_y = mouse_x - x, mouse_y - y
        angle = (180 / math.pi) * -math.atan2(rel_y, rel_x)
        return angle
    Ответ написан
    Комментировать
  • Возникла ошибка при работе Python и MySQL. Как исправить?

    @o5a
    , "Похудел" "Нет",

    Пропущена запятая. Из-за этого оно понимается как один элемент "ПохуделНет" и количество данных в запросе и val не сходится.
    Ответ написан
    1 комментарий
  • Как проверить JSON на обновления?

    @o5a
    Не совсем понятно, в чем собственно вопрос? Как сравнить 2 полученных результата json? Или как делать запрос с интервалом?
    Если объекты уникальный по id, то можно получить список (множество) идентификаторов одного запроса и другого, затем найти отличия id и по ним вывести нужные результаты из нового запроса.
    ids = {result['id'] for result in data['result']}
    print(ids)

    для json из примера получится
    {'8da31f62a40a2eb3973c9df3', '60831f62a40a2eb3973c9df3'}

    Допустим новый json пришел с доп. id (new_ids)
    {'8da31f62a40a2eb3973c9df3', '60831f62a40a2eb3973c9df3', '60831f62a40a2eb3973c9df5'}

    Соответственно получаем список новых id:
    diff_ids = new_ids - ids
    И по ним уже выводим данные:
    news = [result for result in new_data['result'] if result['id'] in diff_ids]

    где new_data это новый запрос json
    Ответ написан
    Комментировать
  • Почему бот выдает ошибку?

    @o5a
    IDE как тут пишут конечно хорошо, но для изучения программирования Sublime вполне подходит. Просто нужно читать свои ошибки.

    Не замечаете, что в представленном Вами коде стоит
    @bot.messege_handler(content_types=['text'])
    а в сообщении об ошибке ругается на строку
    @bot.handler_backends(content_types=['text'])
    Значит, или запускаете не тот файл, или запускаете, не сохранив изменения.
    И правильно должно быть
    @bot.message_handler(content_types=['text'])
    Ответ написан
    Комментировать
  • Почему питон ругается на аргумент?

    @o5a
    Board - сам класс. Для обращения к самому экземпляру класса (созданному объекту) нужно использовать self.
    т.е. нужно вызывать не
    Board.mark_destroyed_ship(sh)
    а
    self.mark_destroyed_ship(sh)
    Ответ написан
  • Система лайков Python?

    @o5a
    Можно так например. Таблица для хранения лайков в разрезе поста и пользователя:
    CREATE TABLE IF NOT EXISTS post_likes (
    id integer primary key,
    post_id integer, -- id поста
    user_id integer, -- id пользователя
    likes integer
    );


    Лайки можно записывать в одно поле "likes". 1 - лайк, 0 - ничего, -1 - дизлайк.
    Соответственно чтобы собрать итоги, можно использовать такой запрос:
    select sum(likes) total_score, -- общий счет
    sum(case likes when 1 then 1 end) sum_likes, -- кол-во лайков
    sum(case likes when -1 then 1 end) sum_dislikes -- кол-во дизлайков
    from post_likes where post_id = нужный_id_поста
    Ответ написан
  • Как при groupby обьединить значения в строку?

    @o5a
    address = result.groupby([‘OE’]).agg({‘Адрес’:','.join})
    Ответ написан
    2 комментария
  • Ошибка при запуске бота в Телеграм - как решить?

    @o5a
    Потому что
    parse_mode='html', ...
    должно быть частью параметров вызова send_message предыдущей строки
    Ответ написан
    Комментировать
  • Как в python сделать случайный выбор, но с определенной вероятностью?

    @o5a
    Есть еще random.choices. В параметре weights как раз указываются веса каждого значения.
    values = [q1, q2, q3]
    data = random.choices(values, weights=[0.2, 0.3, 0.5], k=1000)
    Ответ написан
    Комментировать
  • Как сохранить Audio в переменную?

    @o5a
    Можно передавать дополнительные параметры
    bot.register_next_step_handler(sent, audio_description, audio)
    ...
    def audio_description(message, audio):
    Ответ написан
    1 комментарий
  • Как создать обновляемое ПО на питоне?

    @o5a
    Есть PyUpdater
    Лично не пользовался, но по описанию позволяет реализовать структуру с созданием пакетов обновления, их подписью, установкой этих обновлений на клиентах и т.п.
    Ответ написан
    Комментировать
  • Как вставить данные из возвращающего списка функции Python в таблицу БД?

    @o5a
    С cx_oracle не работал, но вижу, что там можно передавать словарь напрямую, если использовать привязку переменных, так что можно сделать таким образом:
    data = [{'DOC_NUM': None, 'DOC_ORG': '0', 'GROUP_NUM': '987564', 'BOX_TYPE': '9999999 ', 'D_NUM': 'Номер города', 'BOX_NUM': '12345679', 'ADR': 'Огнева'}]
    
    # сформировать список колонок и привязки параметров (по ":")
    columns = ", ".join(data[0].keys())
    bindings = ", ".join((f":{key}" for key in data[0].keys()))
    sql = "insert into my_table ({}) values ({})".format(columns, bindings)
    print(sql)
    # должен получиться такой запрос
    # insert into my_table (DOC_NUM, DOC_ORG, GROUP_NUM, BOX_TYPE, D_NUM, BOX_NUM, ADR) values (:DOC_NUM, :DOC_ORG, :GROUP_NUM, :BOX_TYPE, :D_NUM, :BOX_NUM, :ADR)
    
    #который потом примет словарь данных напрямую (или просто execute, если нужна только одна первая строка data[0]
    cur.executemany(sql, data)
    Ответ написан
    5 комментариев
  • Где и как можно оптимизировать код?

    @o5a
    Возможные изменения (скорее не в плане читаемости, а как можно было бы сделать по самой структуре программы).

    Лучше избавиться от использования глобалов, а просто возвращать результат ответа. А варианты ответа задавать не как сплошной текст рассказа, а отдельным списком. Это позволит сделать проверку ответа более универсальной (т.к. мы знаем количество возможных вариантов ответа, то нам не нужна цепочка elif).
    # принимаем как текст нового абзаца, так и список ответов
    def select(fable, answers):
        print(fable)
        print('\n'.join(answers))
    
        while True:
            # можно добавить проверку ввода букв вместо цифр
            answer = int(input())
            # т.к. мы знаем кол-во вариантов ответов, то сразу можем проверить валидность
            # аналогично можно добавить и другие проверки
            if answer > len(answers):
                print('Неверный ответ, будь внимательнее')
            else:
                break
        # возвращаем результат ответа, не нужны глобалы
        return answer
    
    # и в основной программе соответственно разделяем текст и ответы
    fable = "Жили-были старик со старухой. Вот и просит старик\n   - Испеки мне, старая, колобок.\n   - Да из чего испечь-то? муки нет.\nЧто ответит дед?(выберите цифру ответа):"
    
    # при желании из текста ответа можно и удалить жестко прописанные номера.
    # т.к. это у нас список, то мы ведь их можем сгенерировать налету перед печатью
    answers = ["Ты по амбару подмети, по сусекам поскреби - вот и наберёшь муки (1) ", "Ну ладно, свари мне тогда каши (2) ", "Ладно, пойду на базар, куплю муки, тогда и испечёшь (3) "]
    
    # и собственно запускаем опрос по первому абзацу
    answer = select(fable, answers)
    # полученный номер ответа уже используем в дальнейшей проверке
    
    if answer == 1:
    # аналогично формируем запрос по следующему абзацу, и т.д.
    Ответ написан
  • Как отсортировать по ORDER BY используя ещё и rowid?

    @o5a
    Но хотелось бы как-то отсортировать это по cash и уже получить rowid .

    Не путайте понятия
    rowid - фиксированный уникальный идентификатор для записей столбца, не зависящий от сортировок (но при некоторых условиях может меняться, в зависимости от объявления).
    "место юзера в таблице" при разных сортировках будет разным.
    Так что все-таки требуется? Выяснить rowid пользователя по id (что само по себе нелепо, т.к. id сам по себе должен быть уникальный, нет смысла по нему искать rowid)? Или же найти относительный номер пользователя в отсортированном списке?
    Если второе - тогда есть row_number, в котором указывается сортировка. Так например можно получить место пользователей по голосовой активности
    SELECT id, name, cash, row_number() over(order by cash desc) as rownum FROM users

    И соответственно найти порядковый номер пользователя при такой сортировке
    cursor.execute("SELECT cash, rowid, rownum FROM (SELECT id, name, cash, row_number() over(order by cash desc) as rownum FROM users) WHERE id = ?", (ctx.author.id, )).fetchone()[2]

    rowid и rownum соответственно будут разными (1-й - идентификатор в таблице, 2-й - порядковый номер в сортировке). Т.е. для пользователя с макс. количеством cash rownum будет равен 1, а rowid в зависимости от его идентификатора в таблице.
    Ответ написан
    1 комментарий
  • Две похожих программы(python), одна ждёт нажатия, другая закрывается сразу же, как её исправить?

    @o5a
    Видимо дело с кодировке. Файл в одной, а питон пытается запустить в другой, поэтому ругается на кириллицу.
    Пересохраните скрипт в utf-8.
    Для явного указания кодировки можно ставить в самом начале скрипта строку вида
    # coding:utf-8
    или
    # coding:windows-1251
    соответственно кодировке самого файла.
    Ответ написан
  • Почему Jupyter не видит df['name'] == 2?

    @o5a
    Судя по всему в таблице не число, а строка '2'.
    Ответ написан
    2 комментария
  • Как добавлять новые данные в след строку csv?

    @o5a
    Можно указать запись в режиме добавления ("a"), только отключить запись заголовка, чтобы он каждый раз не писался
    frame.to_csv('1.csv', mode='a', header=False)
    Ответ написан
    1 комментарий
  • Что делать если не выводит нужное значение переменной в Python?

    @o5a
    Проблема здесь:
    if command("prn") == key:
    Это не способ проверить, что команда хочет напечатать переменную. Она только проверяет, что в команде prn использовано значение key, т.е. предыдущее установленное значение переменной, т.е. "b".
    Соответственно срабатывает оно только для "b".
    Можно было проверить так (что в prn используется какая-нибудь из установленных переменных):
    if command("prn") in vars:
    И перебирать ключи потом
    for i in key:
    не нужно, ключ же уже известен, это commant("prn")
    Ответ написан
    5 комментариев