Ответы пользователя по тегу Python
  • Как указать путь к файлу?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Рекомендую либо экранировать обратные слэши (как в моём примере), либо заменить их на прямые слэши (типа C:/Mydir/myfile.txt).
    Кроме того, убедитесь, что после пути к папке photo в вашем варианте стоит слэш; по-моему его там нет.

    Кроме того, конструкция random.choice(os.listdir('photo')) предполагает, что папка photo находится в папке, которая в данный момент для вашего скрипта основная. Но это может быть неожиданно не папка проекта.
    Рекомендую, например, сделать по-другому:
    from pathlib import Path
    
    project_dir = Path('C:\\Projects\\telebot_test_functions\\')
    photo_dir = project_dir / 'photo' 
    photo = open(random.choice([*photo_dir.iterdir()]), 'rb')
    Ответ написан
  • Почему exe-файл бота на aiogram запускается не на всех компьютерах?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Почитайте тут. Вроде ваш случай там описан. Или очень похожий.
    Ответ написан
    Комментировать
  • Как создавать экземпляры класса python?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    В первом приближении класс пользователей - это таблица (например, в реляционной базе данных). Таким образом, создание экземпляра для каждого пользователя суть внесение записи в таблицу. Каждая запись в таблице - это экземпляр класса, соответствующий пользователю.
    Реализовывать это в виде собственно класса можно разными способами - можно вручную прописывать связь полей таблицы и атрибутов класса, можно попытаться подтянуть средствами sql alchemy orm…
    Ответ написан
    Комментировать
  • Как поменять при выводе списка последнюю запятую на 'или'?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Подсказка:
    Выведи последовательность без последнего элемента, потом союз, потом последний элемент.
    Это просто. Можно сделать одной строчкой.
    Тебе понадобятся темы: f-строки и срезы.

    spoiler
    В скобках замечу, что очень полезно будет заодно изучить тему «списки», обратить внимание на литералы списков. Также порекомендую никогда не использовать имена стандартных типов (list, dict и т.п.) в качестве имен своих переменных. Если очень хочется, пиши my_list.
    Ответ написан
    2 комментария
  • Как удалить строку из массива не обладая ID, JSON?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Итак:
    приведенный в вопросе json не валидный, и работать с ним как с json нельзя.
    Я предположил, что мы получаем валидный JSON вот такого вида:
    {
        "users": [
          {"user": "name_test"},
          {"user": "name_test1"},
          {"user": "name_test2"}
        ]
    }

    тогда правильный код будет выглядеть, например, так:
    import json
    
    args = "name_test2"
    with open('config.json', 'rb') as fp:
        jsondata = json.load(fp)
        jsondata['users'] = [item for item in jsondata['users'] if item['user'] != args]
        print(jsondata)
    Ответ написан
  • Код не работает, что делать?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Поигрался со своим чатом,
    короче, вот что получилось
    import asyncio
    
    from pyrogram import Client
    import shelve
    import random
    
    from secret.config import Config
    TEXTS = ['Круто!', 'Nice!!!!', 'Oh my god']
    
    config = Config()
    api_id = config.api_id
    api_hash = config.api_hash
    phone_number = config.phone
    PUBLIC = config.title
    chat_id = config.chat_id
    name = config.name
    processed_messages = shelve.open('processed_messages.db', writeback=True)
    app = Client(name, api_id, api_hash, phone_number=phone_number)
    
    
    async def main():
        async with app:
            public = await app.get_chat(PUBLIC)
            async for msg in app.get_chat_history(chat_id, limit=100):
                if msg.from_user:  # если у нас есть параметр from_user
                    any_sender_id = msg.from_user.id  # присваеваем ID юзера
                else:  # иначе
                    any_sender_id = msg.sender_chat.id  # присваеваем ID канала или чата
                if any_sender_id == public.id:  # проверяем что это нужный паблик
                    if str(msg.id) in processed_messages:
                        print(f'Пропускаем уже обработанное message_id={msg.id}')
    
                    else:
                        processed_messages.update({str(msg.id): True})
                        print(f'Обработка message_id={msg.id}')
                        text = random.choice(TEXTS)
                        print(text)
                        result = await app.send_message(chat_id, text, reply_to_message_id=msg.id)
                        processed_messages.update({str(result.id): True})
    
                        await asyncio.sleep(1)  # пауза, чтоб не банили за флуд
    
    
    app.run(main())
    из твоего кода.
    Конечно, это всё такое... ну... прототип. Пользоваться этим "в лоб" я бы не советовал.
    Ответ написан
    Комментировать
  • Как рандомно расположить объекты без пересечений?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Для решения этой проблемы в игровых движках обычно есть встроенный механизм collide или что-нибудь в таком духе.
    Например, в pygame можно создать объект типа Rect и у него будет методы colliderect(Rect) и collidelist(list); первый проверяет пересечение текущего и указанного объектов Rect; последний метод берет список объектов типа Rect, поданный на вход, и проверяет на пересечение с хотя бы одним из них.
    Так что всё, что вы хотите сделать, уже есть в pygame «из коробки»
    Вам лишь необходимо почитать документацию.
    Ответ написан
  • Pyrogram bot: как отправить фото по айди?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Полагаю, в лоб никак. В документации Telegram сказано, что big_file_idможно использовать только для download.
    В общем, видимо, вам придется их куда-то скачивать (в память?) и затем отдавать в другой чат.
    Ответ написан
    3 комментария
  • Ошибка в коде (Python). Не пойму в чем дело и почему он не пропускает?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    В классе Settings два __init__
    Естественно, второй перезаписывает первый.
    Ответ написан
    1 комментарий
  • Как пройтись по 2 спискам одновременно?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Ну если в лоб, можно проверку на extension сделать внутри цикла по directories.
    Если их не безумное количество и нет необходимости сэкономить микросекунды на каждом цикле, то пойдёт.
    Ответ написан
  • Ошибка str не могу исправить, как ее исправить?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Какая-то из переменных price, name, url приходит из парсера со значением None. Чтобы ошибки не было, надо предварительно проверять каждую переменную на None, либо перехватывать ошибку и обрабатывать (так прямее).
    Ответ написан
    Комментировать
  • Бот не считает формулу. Как исправить?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Как я понял, когда бот начинает работать, он обрабатывает зарегистрированные в нем хэндлеры, и ваш хэндлер lake перехватывает всё, кроме явно start и help, поэтому дальше него и не проходит. Я глубоко не вникал, возможно этот момент я неправильно понял.
    Но, в принципе, можно обойтись и этим одним хндлером, просто правильно обрабатывать то, что в него приходит. А приходить в него должно либо выбор кнопки, либо число.
    При выборе кнопки фиксируем номер кнопки и ждем число. Если пришло число - вычисляем, возвращаем, сбрасываем номер кнопки и всё сначала.

    lake_number = 0
    
    
    @dp.message_handler()
    async def lake(message: types.Message):
        global lake_number
        if message.text == 'Бассейн №1':
            await bot.send_message(message.from_user.id, 'Введи расстояние до воды №1.')
            lake_number = 1
        if message.text == 'Бассейн №2':
            await bot.send_message(message.from_user.id, 'Введи расстояние до воды №2.')
            lake_number = 2
        if bool(lake_number) and message.text.isdigit():
            b = int(message.text)
            if lake_number == 1:
                h = 8 - b
                v = (h / 3)
                level = v / 16000 * 100  # тут в формуле где-то ошибка, поэтому я ее просто убрал
                await bot.send_message(message.from_user.id,
                                       str("Количество:" + str(v) + "м3. Глубина:" + str(h) + "м. Наполнение: " + str(
                                           level) + "%"))
            if lake_number == 2:
                h2 = 5 - ((b - 1) * float(0.7))
                s2 = (90 - (b * 0.52)) * (100 - (b * 0.52)) / 2
                n = sqrt(2500 * s2)
                s1 = 1
                g = s1 + n + s2
                v2 = (h2 / 3) * g
                level2 = v2 / 17000 * 100
                await bot.send_message(message.from_user.id,
                                       str("Количество:" + str(v2) + "м3. Глубина:" + str(h2) +
                                           "м. Наполнение: " + str(level2) + "%"))
            lake_number = 0
            await bot.send_message(message.from_user.id, "Попробуй еще...")
    Ответ написан
    4 комментария
  • Как записывать информацию в CSV каждый раз с новой строки?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Добавьте в конец строки \n

    Снова и снова говорю вам: найдите и проработайте «Изучаем Python». Там всё разжёвано.
    Ответ написан
    Комментировать
  • Как правильно добавить индекс?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    images = ['a', 'b', 'c']
    for c in "educative":
        print(f'perehodim_k_sled_bukve {c}')
        for number, image in enumerate(images):
            print(f'буква {c} цикл {number} image {image}')
    Ответ написан
    Комментировать
  • Pytelegrambotapi name 'a' is not defined, почему?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Потому что в глобал оно не объявлено.
    Ответ написан
  • Почему python не понимает selenium?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    попробуйте так:
    by = 'XPATH'
    value = '//*[@id="sf_url"]'
    video_input = browser.find_element(by=by, value=value)

    Для последней версии selenium оно вроде так работает.
    Ответ написан
  • Как построить график по массиву с данными?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Мне кажется, вы плохо искали. Первое, что попалось в гугле, по-моему, вполне подходит.
    Ответ написан
    Комментировать
  • Можно ли прочитать сразу все элементы в json?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    В общем, Влад Григорьев прав.
    Надо хотя бы читать документацию по тем библиотекам, которые вы подключаете, и методам, которые используете.

    json это в некотором роде аналог словаря в Python, и json.loads возвращает словарь. Сам словарь это ключи и значения ключей. Могут быть вложенные в значения другие структуры.
    Соответственно, чтобы получить значение, надо обратиться к словарю по ключу
    print(my_dict[“key_name”])
    Если попытаться итерировать словарь в лоб, то будут перебираться ключи. Надо их как-то применять.
    for key in my_dict:
        print(my_dict[key])


    У вас будут возвращаться словари нижнего уровня, вложенные в значения основного словаря. Соответственно, там надо «погружаться» глубже.
    Ответ написан
    Комментировать
  • Как сделать перебор более эффективным(чтоб быстрее выдавало результат)?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    from random import randint
    import time
    
    target_pass = str(randint(1000, 10 ** 4)) #. Генерирую случайный целевой пароль длиной 4 цифры. 
    start_time = time.time()
    int_pass = int(target_pass)
    result = None
    for next_pass in range(10 ** len(target_pass)):
       if next_pass == int_pass:
          result = next_pass
          break
    print(result)
    print(time.time() - start_time)
    
    #  Далее твой код, но без печати (с печатью вообще не дождаться). 
    start_time = time.time()
    password = target_pass
    words = [
       1, 2, 3, 4, 5, 6, 7, 8, 9, 0
    ]
    end_password = ''
    old = []
    length = len(words) - 1
    
    
    def func():
       global end_password
       while end_password != password:
          for i in range(1_0_0_0_0):
             end = ''
             for letter in range(len(password)):
                guess = words[randint(0, length)]
                end += str(guess)
             if end not in old:
                old.append(end)
    
                if end == password:
                   end_password = end
                else:
                   pass
                # print(f'{end}')
          # print(end,end=' ')
    
    
    func()
    print(f'\n\n\n\n\n\tHack : {end_password}    | {(time.time() - start_time)}(sec);')
    Ответ написан
    Комментировать
  • Как сделать чтобы программа после выдачи результата выполнялась повторно?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    def get_repl_txt():
        LAT_TXT = "qwertyuiop[]asdfghjkl;'zxcvbnm,."
        RUS_TXT = 'йцукенгшщзхъфывапролджэячсмитьбю'
        return dict(zip(LAT_TXT, RUS_TXT))
    
    def repl(txt, repl_txt):
        txt = txt.lower()
        for lat in repl_txt.keys():
            txt = txt.replace(lat, repl_txt[lat])
        return txt
    
    repl_txt = get_repl_txt()
    next_str = ' '
    while bool(next_str):
        next_str = input()
        print(repl(next_str, repl_txt))
    Ответ написан
    Комментировать