• Возникла ошибка при работе 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 комментариев
  • Как сделать отступы в текстовом поле tkinter нормальной видимости по четыре строки?

    @o5a
    Насколько знаю, там нельзя напрямую выставить в виде количества пробелов, там можно выставлять в различных метрических или экранных значениях. Но можно это значение вычислить например так:
    import tkinter.font as tkfont
    
    font = tkfont.Font(font=text['font'])
    tab_size = font.measure(' '*4)
    # и установить размер табов
    text.config(tabs=tab_size)
    Ответ написан
    1 комментарий
  • Python3 выдает ошибку no such file or directory?

    @o5a
    На втором скриншоте видно, что правильно нужно указывать полное название файла (с расширением). Но также в самом файле должны содержаться данные в формате
    логин|пароль
    Ответ написан
    Комментировать
  • Есть ли способ преобразовать столбец dataframe в строку. DataFrame импортирую из Excel?

    @o5a
    Обычный join можно
    s=','.join(df[1])
    Ответ написан
    Комментировать