Задать вопрос
Ответы пользователя по тегу Python
  • Как ввести длинный поток байтов?

    Vindicar
    @Vindicar
    RTFM!
    sys.stdin.read() в цикле, пока не прочитаешь пустую строку.
    Ну или запиши в файл и читай оттуда, таким же способом.
    Ответ написан
    1 комментарий
  • Как сделать цикл разархированния файлов zip?

    Vindicar
    @Vindicar
    RTFM!
    Шаг 1: сделай на базе своего кода подпрограмму, которая делает то, что нужно, принимая в качестве параметра путь к zip-файлу и путь к целевой папке session.
    Шаг 2: получи список путей к zip-файлам, подлежащих обработке
    Шаг 3: для каждого файла вызови свою подпрограмму.
    Ответ написан
  • Как сделать правильный порядок отображения?

    Vindicar
    @Vindicar
    RTFM!
    Что-то такое?
    from collections import Counter
    from collections.abc import Hashable
    
    def combine_suggestions(user: list[Hashable], glob: list[Hashable]) -> list[Hashable]:
        uc = Counter(user)
        gc = Counter(glob)
        for key in uc:
            gc.pop(key, None)
        u = uc.most_common()
        g = gc.most_common()
        return [item[0] for item in (u + g)]

    https://docs.python.org/3.9/library/collections.ht...
    Ответ написан
    Комментировать
  • Почему callback_query_handler не видит call.data?

    Vindicar
    @Vindicar
    RTFM!
    Во всех примерах это работает именно так...

    Не верю.

    bot.register_next_step_handler() принимает обработчик следующего сообщения, а не кнопки. Собственно, твоя функция и получает объект сообщения.
    Ответ написан
    2 комментария
  • Не правильная проверка ячейки таблицы через цикл, почему не записывается переменная?

    Vindicar
    @Vindicar
    RTFM!
    Ты уверен? Как насчёт явно задать порядок выборки нужных тебе столбцов в select?
    Что-то в духе SELECT id, name, chat_id FROM users. Названия столбцов укажи свои, и только используемые в данном коде.

    Далее, с БД так не работают. Ты выбираешь все строки, а потом вручную ищешь совпадение - это глупо.
    Лучше попроси БД найти нужные тебе строки.
    cur.execute('SELECT id, name FROM users WHERE chat_id = ?', (call.message.chat.id,))


    К слову, что ты подразумеваешь с под "третья"? Индекс 3? Или "третья с начала" (индекс 2)?
    Ответ написан
    Комментировать
  • Почему падает бот?

    Vindicar
    @Vindicar
    RTFM!
    Рвётся коннект до телеграмма. Сеть - штука ненадёжная, может у провайдера админ пьяный, может, контакт плохой, может, РКН балуется.
    Допиши скрипт, чтобы при ошибке соединения бот перезапускался.
    Я бы начал с чего-то типа
    import time
    from requests.exceptions import RequestException
    
    while True:
        try:
            bot.infinity_polling(timeout=10, long_polling_timeout = 5))
        except RequestException as err:
            print(err)
            print('* Connection failed, waiting to reconnect...')
            time.sleep(15)
            print('* Reconnecting.')
    Ответ написан
    1 комментарий
  • Как правильно использовать оператор or в pyautogui?

    Vindicar
    @Vindicar
    RTFM!
    Первый вариант правильный, второй не очень.
    Но есть два но:
    1. Тебе важен только сам факт наличия картинки на экране, или нужны её координаты?
    Если нужны координаты, то лучше сделать по умному, и не искать одну и ту же картинку дважды:
    # перечисляешь в списке изображения. цикл остановится на первом найденном.
    for image in ['link.png', 'link1.png']:
        location = pyautogui.locateOnScreen(image)
        if location is not None:
            break
    else:
        image, location = None, None

    Тогда дальше сможешь проверить, если location is not None - значит, что-то нашли. Что именно - лежит в image. Где именно - лежит в location.

    2. Какая у тебя версия библиотеки pyautogui? Начиная с 0.9.41, вместо функция locateOnScreen(), не найдя изображение, не вернёт None, а выкинет исключение. Тогда код будет выглядеть как-то так:

    for image in ['link.png', 'link1.png']:
        try:
            location = pyautogui.locateOnScreen(image)
        except pyautogui.ImageNotFoundException:
            pass
        else:
            break
    else:
        image, location = None, None
    Ответ написан
    Комментировать
  • Возникает ошибка, но не знаю какая?

    Vindicar
    @Vindicar
    RTFM!
    Волшебный человечек пришел в магазин и обнаружил, что у него есть ровно по две монетки каждого достоинства.

    Я не вижу, как ты учитываешь этот факт. Если ты прочитал со входа номиналы монет "5 10 50 100", то тебе нужно использовать для разложения список монет [5, 5, 10, 10, 50, 50, 100, 100].
    Ответ написан
  • Как замокать метод __next__?

    Vindicar
    @Vindicar
    RTFM!
    Вообще делать return self из __iter__() не очень хорошая идея.
    Или верни итератор по внутренней коллекции, т.е. iter(self.nums). Это имеет смысл, так как чтение коллекции циклом for по-хорошему не должно приводить к её модификации. Для этого лучше сделать явный метод.
    Или сделай из __iter__() генератор, и делай yield значения.

    В обоих случаях определять __next__() не потребуется.
    Ответ написан
    2 комментария
  • Как передать параметр в декоратор в рантайме?

    Vindicar
    @Vindicar
    RTFM!
    Декорировать функцию после получения параметров. Не забывай, что
    @formatter(p1, p2)
    def csv_reader(filename, request):
        ...

    эквивалентно
    def csv_reader(filename, request):
        ...
    
    _temp = formatter(p1, p2)
    csv_reader = _temp(csv_reader)


    Альтернативно, пусть возвращаемая фукнкция имеет свойства:
    def formatter(parse_func):
        def output_func(*args):
            ...  # тут обращаемся к output_func.p1, например
    
        output_func.p1 = p1
        output_func.p2 = p2
        return output_func
    
    
    @formatter
    def csv_reader(filename, request):
        ...
    
    csv_reader.p1 = a1
    csv_reader.p2 = a2

    Вместо функции можно вообще вернуть callable object, т.е. объект класса с методом __call__(), и любыми нужными свойствами и методами.
    Ответ написан
    1 комментарий
  • Почему метод get.users, flieds = online, возвращает None?

    Vindicar
    @Vindicar
    RTFM!
    Попробуй передать параметр по имени, .get(user_ids=user_id)
    Ответ написан
  • Почему код перестает работать при импорте?

    Vindicar
    @Vindicar
    RTFM!
    sqlite не поддерживает толком одновременную работу в нескольких потоках.

    1. У тебя парсер? Перепиши код на асинхронный, тебе не сдалось на самом деле использовать потоки. Они 90% времени будут спать и ждать сетевого ответа. Асинхронный код выполняется в одном потоке, так что таких проблем не будет.
    2. Создай отдельный поток, который будет заниматься только работой с базой, и общаться с остальными через какое-то api, например, кладём запрос, данные и какой-то id в очередь, потом читаем ответ из словаря. Но ты по факту будешь писать свой кривенький СУБД-сервер, так что...
    3. Вместо sqlite используй любую полноценную СУБД, которая умеет параллельные соединения. Postrge, mariadb, что угодно.
    Ответ написан
  • Отличается ли мультипроцессинг от запуска нескольких программ?

    Vindicar
    @Vindicar
    RTFM!
    Простотой коммуникации между скриптами, в т.ч. распределения задач между ними.

    Во-втором случае у тебя есть готовое решение по распределению задач и сборке результатов. Но с ограничениями - например, под капотом используется pickle, так что передавать можно только ограниченный набор объектов.

    В первом случае всё придётся писать самому, что и плюс, и минус.
    Ответ написан
    Комментировать
  • Как ловить статус и от этого выводить результат?

    Vindicar
    @Vindicar
    RTFM!
    Вместо строки возвращай кортеж или словарь. Короче, структуру данных.
    from typing import NamedTuple
    
    class Result(NamedTuple):
        text: str  # текст запроса
        success: bool  # успешен ли запрос
        status: str  # статус
    
    async def check_text(text: str) -> Result:
        url = f'https://сайт.com/?query={text}'
    
        async with aiohttp.ClientSession() as session:
            async with session.get(url) as response:
                if response.status != 200:
                    return Result(text=text, success=False, status='Не удалось определить результат')
                html = await response.text()
                soup = BeautifulSoup(html, 'html.parser')
                status_element = soup.find('div', class_='table-block')
                if not status_element:
                    return Result(text=text, success=False, status='Не удалось определить результат')
                status_text = status_element.get_text().strip()
                # тебе нужно будет решить, когда запрос был успешен (True), а когда нет (False)
                if "ok" in status_text:
                    return Result(text=text, success=True, status='Можно')
                elif "no" in status_text:
                    return Result(text=text, success=False, status='Данный вариант недоступен')
                elif "no1" in status_text:
                    return Result(text=text, success=True, status='Можно под заказ')
                else:
                    return Result(text=text, success=False, status='Неизвестно')

    Тогда можно будет анализировать результат просто:
    result = await check_text(text)
    if result.success:
        ...  # реагируем на успешный запрос
        logger.info('%s: %s', result.text, result.status)
    else:
        ...  # реагируем на неудачный запрос
        logger.info('%s: %s', result.text, result.status)
    Ответ написан
  • Почему происходит «Сайт XXX выполнил переадресацию слишком много раз» и как исправить ошибку «the STRING opcode argument must be quote»?

    Vindicar
    @Vindicar
    RTFM!
    ganstar565, внезапно, зависит от браузера. Например, гугл "firefox cookie storage format" даёт такой ответ:
    Cookies in Firefox are stored in an SQLite format database found in the file cookies.sqlite in the currently-active user profile directory (exact path is system-dependent).

    Иными словами, смотришь папку %APPDATA%\Mozilla\Firefox\Profiles, в ней каждый подкаталог - профиль браузера, часто один, но может быть несколько. Внутри подкаталога лежит файл cookies.sqlite.
    Путь можно сконструировать с помощью os.path.expandvars() (и модуля os.path в целом), файл открыть стандартным модулем sqlite3, а дальше смотри что внутри таблицы moz_cookies.
    Для остальных браузеров по аналогии - гугл, потом эксперименты.
    Ответ написан
    9 комментариев
  • Как исправить ошибку чтения аргумента?

    Vindicar
    @Vindicar
    RTFM!
    __getattribute__() вызывается ДО проверки содержимого __dict__. В большинстве случаев нужен __getattr__().
    А вообще, что ты пытаешься сделать?
    Ответ написан
    3 комментария
  • Можно ли оптимизировать этот код?

    Vindicar
    @Vindicar
    RTFM!
    Можно, если сделать допущение, что текст кодируется посимвольно, а не группами из N символов.
    open_text = 'текст'  # открытый текст
    
    # letters - именно строка, одна позиция - один символ
    letters = ''.join(['а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф',
           'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я'])
    key = 5  # ключ к шифру - величина сдвига. Может быть >0 или <0
    # генерируем таблицы подстановки
    encrypt_table = str.maketrans(letters, letters[key:]+letters[:key])  # для шифрования
    decrypt_table = str.maketrans(letters, letters[-key:]+letters[:-key])  # для дешифрования
    
    cypher_text = open_text.translate(encrypt_table)
    restored_text = cypher_text.translate(decrypt_table)
    
    print(open_text)
    print(cypher_text)
    print(restored_text)
    Ответ написан
    Комментировать
  • Как получить url страницы и какие есть способы изменять html код через python?

    Vindicar
    @Vindicar
    RTFM!
    Ты упускаешь из виду, что современные страницы часто набиты скриптами, да и банальную необходимость авторизации на сайте. Иными словами, если ты через requests запросишь тот же URL, далеко не факт что ты получишь ту же самую страницу. Тут нужно само содержимое страницы вытаскивать. А оно может быть большое, так что лучше уж выбранный текст.
    Это проще всего сделать через браузерное расширение. Альтернатива - добавить окошко/иконку на панель задач/в трей, куда можно будет перетащить выделенный текст.
    Ответ написан
    Комментировать
  • Правильная и красивая замена if?

    Vindicar
    @Vindicar
    RTFM!
    В комментариях уже написали простое решение, а я его чуток разовью.

    import typing as tp
    
    Func = tp.Callable[[], None]  # функция без апарметров, возвращает None
    
    class FuncMap:
      def __init__(self):
        self.map: tp.Dict[str, Func] = dict()
    
      def register(self, key: str) -> tp.Callable[[Func], Func]:
        def decorate(f: Func) -> Func:
          self.map[key] = f
          return f
        return decorate
      
      def get(self, key: str) -> Func:
        return self.map[key]
      
      def run(self, key: str):
        return self.map[key]()
    
    # а вот так этот класс используется
    fmap = FuncMap()
    
    @fmap.register('11')
    def test():
      print('This is test()')
    
    fmap.run('11')
    Ответ написан
    2 комментария
  • Возможно ли закрыть файл.ini на python?

    Vindicar
    @Vindicar
    RTFM!
    Откуда у тебя приходит переменная config? Где она ещё используется?
    read() будет дочитывать данные в текущее состояние конфига, не сбрасывая его в ноль перед чтением.
    Не экономь, создавай отдельный экземпляр парсера на каждый файл.

    Ну и да, база данных в ini? Лучше не надо. sqlite не настолько сложен.
    Ответ написан
    Комментировать