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

    @o5a
    Можно передавать дополнительные параметры
    bot.register_next_step_handler(sent, audio_description, audio)
    ...
    def audio_description(message, audio):
    Ответ написан
    1 комментарий
  • Как вставить данные из возвращающего списка функции 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])
    Ответ написан
    Комментировать
  • Как сделать чтоб программа автоматически создавала переменные в Python?

    @o5a
    Вам нужен словарь. Ключом будет название вопроса, значением - ответ. Пример:
    answers = {}
    def create_input(question):
        answers[question] = input(question)
        print(question, answers[question])


    Конкретная реализация уже от самой задачи.
    Ответ написан
    Комментировать
  • В чем заключаеться ошибка?

    @o5a
    вместо "select ..", q= ... прибавлять сумму в самом SQL:
    cursor.execute("UPDATE users SET cash = cash + ? WHERE id = ?", (arg, member.id))
    Ответ написан
    Комментировать
  • Как правильно проверить?

    @o5a
    Как уже тут замечали, лучше использовать нормальную структуру, где по id пользователя привязываются все нужные типы машины (по 1 на каждую запись), т.е. таблица вида "user_cars(user_id, car)". Тогда можно будет за запрос сразу получить просто список машин пользователя "SELECT car FROM user_cars WHERE user_id = ..."

    А при данной структуре можно слить значения в одну "цифровую" строку (и заодно использовать передачу параметров вместо форматирования текста)
    cursor.execute(f"SELECT honda||spyder||yamaha||ford||lancer||nissan car_info FROM cars WHERE id2 = ?", (ctx.author.id, ))

    В результате запрос возвратит скажем "001010" если у пользователя есть yamaha + lancer. Затем сравнить со списком машин. Например так
    # допустим получили такую строку флагов из таблицы
    car_flag = "001010"
    # список машин в таком же порядке, как столбцы таблицы
    cars = ['honda', 'spyder', 'yamaha', 'ford', 'lancer', 'nissan']
    # сопоставляем нашу строку флагов со списком машин
    user_cars = [car for car, flag in zip(cars, car_flag) if flag == "1"]
    print(user_cars)
    # ['yamaha', 'lancer']


    --
    Еще можно использовать названия полей напрямую из запроса через cursor.description, примерно так:
    data = cursor.execute(f"SELECT * FROM cars WHERE id2 = ?", (ctx.author.id, ))
    for value, name in zip(data, map(lambda x:x[0], cursor.description)):
        if value = 1:
            print(name)
    Ответ написан
    Комментировать
  • Как достать значение переменной из другой фукнции?

    @o5a
    Судя по коду getDirectory() это метод класса, т.е. и вызывать его надо соответствующе
    folderGame = self.getDirectory()
    MainWindow только не понятно зачем прописан в параметрах
    Ответ написан
    1 комментарий
  • Как очистить sqlite?

    @o5a
    База и таблица это разные вещи.
    Чтобы очистить таблицу как раз указанная команда delete и подойдет. Только не забыть после этого сделать commit.
    Ответ написан
  • Как сделать отслеживание изменений в файле Python?

    @o5a
    Если речь про файл лога, то он будет только дозаписываться, т.е. старые данные не меняются.
    Так что можно просто продолжать считывать уже открытый, при каждом чтении данные будут пополняться (если они появились).
    word = '[CHAT]' # Word there we search
    f = open('LOG.log','r') # File where searching word
    while True: # infinite cycle
        text = f.read().split('\n') # Reading a file and splitting it by delimiter ('\n')
        for i in text: # Searching word
            if word in i: # If i have word
                print(i) # Printing word
        time.sleep(1)
    Ответ написан
    Комментировать
  • Код работает без ошибок но в консоль ничего не выводит почему?

    @o5a
    Во-первых, сама подстановка названия в ссылку некорректная.
    r = requests.get('https://www.gismeteo.ua/weather-Gorod/'% (city))


    Судя по примеру реальной ссылки "https://www.gismeteo.ua/weather-kyiv-4944/"
    Там должно быть
    r = requests.get('https://www.gismeteo.ua/weather-%s/'% (city))

    или
    r = requests.get(f'https://www.gismeteo.ua/weather-{city}/')

    И чтобы бот ответил, ему надо писать в виде "Погода kyiv-4944"

    Во-вторых, скорее всего понадобится передать заголовки, чтобы запрос был похож на браузер, хотя бы простые
    r = requests.get(f'https://www.gismeteo.ua/weather-{city}/', headers={'User-agent': 'Mozilla/5.0'})


    И насколько вижу, никакого json запрос не возвращает, это просто HTML страница, так что данные придется доставать самому, например через bs4.
    Ответ написан
    2 комментария
  • При создание овала на холсте canvas я могу перемещать овал, но когда я создаю второй овал я не могу перемещать первый овал только второй?

    @o5a
    Можно так
    def move_oval(event):# перемещает овал
        canvas = event.widget
        # находим ближайший объект
        obj = canvas.find_closest(event.x, event.y)[0]
        # для оценки направления движения возьмем центр объекта
        x1,y1,x2,y2 = canvas.coords(obj)
        cx = (x2+x1)//2
        cy = (y2+y1)//2
        canvas.move(obj, event.x-cx, event.y-cy)
    Ответ написан
    Комментировать
  • Я не могу понять почему я не могу перемещать объект с помощью мышки на canvas python?

    @o5a
    Конкретно в данном случае проверка координат не проходит потому что x1/y1 выставлено больше x2/y2
    x1 = event.x + 50
    y1 = event.y + 50
    x2 = event.x - 50
    y2 = event.y - 50
    Ответ написан
    Комментировать