Ответы пользователя по тегу Python
  • Вложенный цикл_при решении, почему ошибка?

    @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),

    и аналогично для каждого поля
    Ответ написан
  • Конвертирование координат при помощи python?

    @o5a
    Вам же прямым текстом показали ссылку https://pyproj4.github.io/pyproj/stable/gotchas.ht...

    Используемый вами синтаксис устарел и в текущей версии модуля лучше использовать предложенный там Transformer.
    Насколько понимаю, такой синтаксис
    from pyproj import Transformer
    
    transformer = Transformer.from_crs("epsg:3857", "epsg:4326", always_xy=True)
    x1,y1 = ('4702932.98067679','6656376.87212693')
    x2,y2 = transformer.transform(x1, y1)
    print (x2,y2)
    Ответ написан
    Комментировать
  • Как правильно сохранить скриншот на диск (C:\)?

    @o5a
    Потому что там русская "С" вместо латинской.
    Ответ написан
    4 комментария
  • Как перевести dict в dataframe и наоборот?

    @o5a
    import pandas as pd
    
    data = {
    "слово": 1,
    "не": 2,
    "воробей": 30
    }
    
    df = pd.DataFrame(data.items(), columns = ['word', 'value'])
    print(df)

    Но как уже заметили, не понятно, зачем тут нужен словарь, если это просто подряд идущие значения. По факту это просто список.
    Ответ написан
    1 комментарий
  • Не получается решить задачу яндекс.практикум, python?

    @o5a
    Я так понимаю это практикум по pandas? Тогда и расчеты видимо предполагаются через функционал пакета, а не циклами. В pandas можно писать условия выборки например так:
    df[df['interval'] == 'До внедрения роботов']
    Это вернет DataFrame, у которого в колонке 'interval' указанное значение. Т.е. так получим выборку всех данных "до внедрения роботов".
    Останется применить к ним подсчет количества строк.
    Можно через метод shape
    Так мы сразу получим нужное количество записей с такими данными. Аналогично "после внедрения".
    Ответ написан
    Комментировать
  • Как передать значение в команду sqlite3?

    @o5a
    Подстановка значений в таком виде НЕ работает для идентификаторов, которыми являются названия таблиц и полей. В данном случае подставить можно через обычное форматирование строки:
    cur.execute("SELECT COUNT(*) FROM users WHERE {} == 1".format(mmml))
    или
    cur.execute(f"SELECT COUNT(*) FROM users WHERE {mmml} == 1")

    Возможно правильнее будет изменить сами таблицы, ведь эти нумерованные n1...6 похожи на какие-то костыли.
    Ответ написан
    2 комментария
  • Ошибка записи данных из бота в файл?

    @o5a
    Потому что это так не делается. От того, что хэндлеры записали как вложенные функции, они не будут работать только внутри тех функций. Первый записанный хэндлер одинакового типа (в данном случае content_types=['text']) и будет использоваться для всех вводов.
    В данном случае подойдет использование register_next_step_handler, когда указывается функция, обрабатывающая последующий шаг операции. Про нее много где написано подробно, в т.ч. на этом сайте.
    Для данного бота будет примерно так:
    вместо
    @bot.message_handler(commands=["api_id"])
    def api_id(m, res=False):
        bot.send_message(m.chat.id, 'Введите Api ID, полученное на сайте my.telegram.org')
        @bot.message_handler(func=lambda message: True, content_types=['text'])
        def msg(message):
            print(message.text)
            f = open('C:/Users/асер/Desktop/python/bot/api_id.txt', 'a')
            f.write(message.text + '\n')
            f.close()
            bot.send_message(m.chat.id, 'Прекрасно!')

    сделать так (указать запрос api_id следующим шагом):
    @bot.message_handler(commands=["api_id"])
    def api_id(m, res=False):
        bot.send_message(m.chat.id, 'Введите Api ID, полученное на сайте my.telegram.org')
        # указываем запуск следующего шага обработки - свою функцию
        bot.register_next_step_handler(message, get_api_id)
    
    def get_api_id(message):
        print(message.text)
        with open('C:/Users/асер/Desktop/python/bot/api_id.txt', 'a') as f:
            f.write(message.text + '\n')
        bot.send_message(m.chat.id, 'Прекрасно!')


    Аналогично для обработчиков других команд.
    Ответ написан
    1 комментарий
  • Как получить аватар пользователя в телеграме?

    @o5a
    Нужно обращаться к элементам, как к аттрибутам объекта, а не ключам словаря
    result.photos
    x.width
    photo.file_id
    Ответ написан
    Комментировать
  • Как решить данную проблему с SQLite?

    @o5a
    Как уже объяснили, если пользователя нет, то и данных не возвратит, в результате цикла не будет. Простым изменением можно просто возврат результата внести внутрь цикла:
    ...
                for row in result:
                    singup = str(row[0])
                    return singup

    или же напрямую
    ...
                for row in result:
                    return str(row[0])

    В таком случае если пользователь есть, то вернет его данные. Если нет, то None. И если специальные параметры соединения не указывали, то row итак возвращает текстом, так что можно просто:
    return row[0]
    Ответ написан
    Комментировать
  • Как сложить все массивы класса?

    @o5a
    Я так понял что-то типа такого, для неизвестного количества элементов
    from dataclasses import fields
    
    def combine(elements):
        data = {field.name: sum([getattr(elem,field.name) for elem in elements],[]) for field in fields(elements[0])}
        return Element(**data)
    
    a = Element(...)
    b = Element(...)
    ...
    
    c = combine([a, b])
    Ответ написан
    Комментировать
  • Можно ли записать в файл дату, и потом загрузить из файла дату в таком же формате?

    @o5a
    Если хочется в строке видеть человекопонятную дату, можно использовать стандартный ISO
    import datetime
    
    my_date = datetime.datetime.now()
    my_string = my_date.isoformat()
    print(my_string)
    
    date_from_string = datetime.datetime.fromisoformat(my_string)
    print(date_from_string)
    Ответ написан
    Комментировать
  • Почему в файле .cvs иероглифы вместо букв после парсинга python?

    @o5a
    Для русского Excel кодировка по умолчанию при открытии CSV считается Windows-1251, вот в ней он и открывает. Так что если нужна возможность открывать сразу в Excel, то при сохранении указывайте windows-1251 именно. Но сам по себе CSV файл нормальный и в текущем виде, дело в самой особенности Excel.
    Ответ написан
  • Как тут имитировать клик каждого обьекта li в dropdown?

    @o5a
    Проблема в том, что item принадлежит изначальному объекту driver (первоначальной загруженной странице). Но после выбора варианта товара (нажатия item.click() ) загружается новая страница с этим вариантом. В результате driver загружается уже другой страницей. А item все так же продолжает ссылаться на объект из первоначальной. Потому и возникает такая ошибка.

    Я не эксперт в селениуме, может есть более правильный способ, но в данном случае навскидку вижу можно просто каждый раз заново искать элемент для клика, перебирая по индексам, вместо объектов item.
    for idx in range(len(items)):
        time.sleep(1)
        # заново ищем элемент
        item = driver.find_element_by_xpath(f"//li[@class='b-custom-drop-down__list-item'][{idx+1}]")
        item.click()
        ...

    В данном случае предполагается, что на каждой такой странице список вариантов одинаковый. Иначе конечно же получим ошибку при попытке выйти за пределы списка.
    Ответ написан
    Комментировать
  • Incorrect number of bindings supplied. The current statement uses 3, and there are 1 supplied. Как решить проблему?

    @o5a
    Ошибка говорит о том, что в качестве параметра execute передается несоответствующее запросу число данных.

    В 'INSERT INTO post VALUES (?, ?, ?)' предполагается 3 значения, а tuple(data.values()) содержит только одно, т.е. в словаре только 1 ключ. Проверяйте, что туда пишете и что хотите взять.
    Ответ написан
    Комментировать
  • TypeError: list indices must be integers or slices, not str в JSON?

    @o5a
    Логично же, что если делать
    njson = [item for item in data['data']['list'] if item['user']['name'] == 'name1']

    то njson будет списком, а не вложенным словарём. И обращаться к его элементам как njson['data']['list'] не имеет смысла.

    Если цель была отфильтровать тот список внутри изначального json, то его и нужно было менять:
    data['data']['list'] = [item for item in data['data']['list'] if item['user']['name'] == 'name1']
    Ответ написан
    Комментировать
  • Как изменить переменную в бд, при условии наличия нужного параметра из того-же бд?

    @o5a
    Если речь про формирование бонуса по условию, зависящему от других полей (как в данном случае buster1 и т.п.), можно это прописать в самом запросе через оператор case (по логике похоже на ветвления if в самом python). Например:

    sql = "UPDATE users SET balance = balance + \
    CASE WHEN buster1 = 'Нет' AND buster2 = 'Нет' AND buster3 = 'Нет' THEN 0.010 \
        WHEN buster1 = 'Да' AND buster2 = 'Нет' AND buster3 = 'Нет' THEN 0.050 \
        WHEN buster1 = 'Да' AND buster2 = 'Да' AND buster3 = 'Да' THEN 0.100 \
    END \
    WHERE id = ?"

    И соответственно в запросе передавать только id пользователя, сам бонус будет считаться автоматически.
    Таким образом сами формируете зависимость бонуса от этих полей.

    Если же имелось в виду что-то другое, лучше пишите подробнее с примером.
    Ответ написан
    1 комментарий
  • Почему функция срабатывает дважды?

    @o5a
    Перепроверьте еще раз свой код. В приведенном куске указанной проблемы нет: для каждой опции все будет срабатывать только 1 раз. Можете сами проверить приведенный кусок в отдельном скрипте. Если что-то повторяется, значит или этот кусок отличается от реального кода, или в остальном коде функция повторно вызывается.

    И не стоит комментировать каждую строку. Комментарии должны помогать понять логику работы куска кода, а не дублировать сам код. Нет никакого смысла в подобных комментариях:
    return bd #возвращаем получившуюся БД
    Ответ написан
    Комментировать
  • Как победить ошибку "name is not defined"?

    @o5a
    1. Чтобы интерфейс работал, нужно запустить цикл (mainloop)
    ...
    btn.pack()
    
    root.mainloop()

    А чтобы продолжить работать с телеграмом потом (если нужен его цикл), можно прекратить работу tk, вызвав root.destroy()
    2. Свою функцию messages = ut нужно вызывать уже после того, как переменная ut установлена. Например, в той же самой функции conn:
    def conn():
        ut = user_text.get()
        root.destroy()
        telegram_send.send( messages = ut )
    Ответ написан
    Комментировать