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

    Vindicar
    @Vindicar
    RTFM!
    Ну для начала я бы посоветовал использовать json вместо pickle. pickle даёт бинарную строку, которая нечитаема человеком. Кроме того, как написано большими красными буквами в доках на pickle, он имеет уязвимости, так что ни в коем случае нельзя передавать через него недоверенные данные.

    В коде много кривых вызовов не по делу.
    ff = open(file_name, 'rb')
    baza = {ff}

    Что сиё должно означать вообще? Ты создал множество из одного элемента - файлового объекта ff. Или ты ожидал, что это магически превратит файл в словарь?
    Как правильно:
    import json 
    #оператор with обеспечит закрытие файла, как только управление покинет тело оператора
    #явное указание кодировки подстрахует от получения "кракозябр" на выходе
    #Кодировка utf-8 позволит использовать символы любых алфавитов.
    with open('Список.txt', 'rt', encoding='utf-8') as ff:
        baza = json.load(ff)

    Далее.
    baza.update({users_name.title():users_numbe})
    Зачем? Почему не написать просто:
    baza[users_name.title()] = users_numbe
    Далее.
    f.close
    Ты взял адрес метода close у объекта f. Ты НЕ вызвал метод close. Чтобы метод вызвать, нужно указать круглые скобки. Впрочем, если используешь with, то он вызовет close() за тебя.
    Так что:
    with open('Список.txt', 'wt', encoding='utf-8') as ff:
        json.dump(
            baza, #что записываем
            ff, #куда
            ensure_ascii=False, #не ASCII-строки пишем как есть, без кодирования
            indent="    ", #сделать отступ, не писать всё в одну строку
            sort_keys=True, #отсортировать ключи по алфавиту
        )

    Остальное примерно так.
    Ответ написан
    Комментировать
  • Как создать напоминание в телеграм боте? Напоминалка каждый месяц?

    Vindicar
    @Vindicar
    RTFM!
    0. Ставишь aiogram и читаешь Quick start, чтобы понять, как в целом будет устроен бот.
    1. Создаёшь и ведёшь базу пользователей бота, например, в sqlite3. Как её наполнять, это уже второй вопрос. Также может потребоваться отдельная таблица напомнинаний, но тебе виднее что за напоминания будут.
    2. В боте создаёшь через asyncio.create_task() бесконечную задачу, которая
    - проверяет время
    - если сейчас подходящее время (скажем, полдень, 1е число месяца, плюс-минус 30 секунд), вызывает корутину уведомления пользователей,
    - засыпает на минуту с помощью await asyncio.sleep() (ни в коем случае не time.sleep()).
    3. Корутина уведомления пользователей должна извлекать из твоей базы уведомления, которые нужно отправить и id пользователей, которым эти уведомления нужно отправить (см. доки по sqlite3 как извлекать данные из БД запросом SELECT). Затем для каждого пользователя она должна отправить текст (см. доки по aiogram) и обработать возможное исключение (например, если пользователь заблокировал бота).
    4. Может потребоваться пара обработчиков команд, чтобы добавлять/менять текст напоминаний.
    Ответ написан
  • Как это реализовать в discord.py?

    Vindicar
    @Vindicar
    RTFM!
    Ну простая же задача, на логику.
    У тебя при вводе команды отрабатывает функция Mishka(), а генерируешь случайный вариант ты вне её, один раз.
    Внеси случайную генерацию внутрь, и будет тебе счастье.
    Ответ написан
  • Как сделать последовательную проверку?

    Vindicar
    @Vindicar
    RTFM!
    Не пиши простыню кода, а разбей задачу на составляющие.
    Для начала отрефактори(переделай) свой код в функцию такого вида:
    def is_guid_accepted(guid: str) -> bool:
        #тут код

    Т.е. функция, которая принимает GUID и возвращает либо True (подтверждён), либо False (не подтверждён). При ошибке можешь выбрасывать исключение, или тоже возвращать False.

    После этого задача упростится.
    1. Прочитать содержимое .xlsx файла, если так уж хочется эксель (а может, всё же csv? будет проще), вытащить из него список GUID'ов и task_id. Гуглится.
    2. Для каждого GUID в списке вызвать функцию выше.
    3. Если функция вернула True, то добавить task_id в список успешных.
    4. Для каждого task_id в списке успешных отправить оповещение. Тебе виднее, как.
    Ответ написан
    1 комментарий
  • Почему телеграм бот долго реагирует на команды?

    Vindicar
    @Vindicar
    RTFM!
    async with pool.acquire() as conn:
    async with conn.cursor() as cursor:

    Как по вашему, что делают эти строки?
    Такое ощущение, что он каждый раз подключается к бд, прежде чем выдать ответ.
    Ответ написан
  • Как сделать отправку рандомного вопроса из уже заготовленных для телеграм бота на Aiogram?

    Vindicar
    @Vindicar
    RTFM!
    Ну так и примени. Вставь определение вопроса внутрь t() и замени отправляемый текст на содержимое question.
    Ответ написан
    Комментировать
  • Как создать баркод?

    Vindicar
    @Vindicar
    RTFM!
    Вряд ли какая-то библиотека для создания штрихкодов это позволяет.
    Так что генерируй штрихкод как умеешь, а потом вставь его в большее изображение с помощью Pillow.
    Ответ написан
    Комментировать
  • Как восстановить подключение к сокету python?

    Vindicar
    @Vindicar
    RTFM!
    Пересоздай сокет client?
    Ответ написан
    Комментировать
  • Как сделать так что бы Socket не стопорил цикл?

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

    Я бы посоветовал освоить использование select() - эта функция позволяет узнать, есть ли в сокете непринятые данные, прежде чем пытаться их принять.

    Также можно попробовать освоить работу через asyncio, это упрощает совершенствование приложения в дальнейшем. Но это также сложнее для начинающего, нужно немножко "вывихнуть мозг" чтобы понять, как работает асинхронная программа.
    Ответ написан
    Комментировать
  • Как удалить элементы из списка с одинаковым окончанием?

    Vindicar
    @Vindicar
    RTFM!
    Перефразирую - нужно удалить из списка все элементы, для которых существует хотя бы один другой элемент с совпадающими N последними символами. Так?
    Используй collections.Counter.
    l1 = ['Ивановы', 'Петровы', 'Сидоровы', 'Груши', 'Яблоки', 'Стол', 'Машина', 'Лампа', '940345']
    N = 2
    suffixes = collections.Counter( item[-N:] for item in l1 )
    l2 = list( filter( lambda item: suffixes[item[-N:]] <= 1, l1 ) )
    Ответ написан
    6 комментариев
  • Некорректно передаться данные с сервера на клиент, в чём причина?

    Vindicar
    @Vindicar
    RTFM!
    ну для начала стоит закрыть файл... лучше всего - через оператор with.
    def install():
        with open("starting.exe", "wb") as file:
            data = client.recv(1024)
            while data:
                file.write(data)
                data = client.recv(1024)

    Далее, как клиент поймёт что всё было передано? По закрытию соединения?
    Так тогда сервер должен корректно закрыть это соединение и дать клиенту понять, что больше данных не будет!
    user.shutdown(socket.SHUT_RDWR)
    user.close()
    Ответ написан
  • TypeError: 'TextChannel' object is not iterable?

    Vindicar
    @Vindicar
    RTFM!
    for message in channel:

    Внезапно, так делать нельзя. Кури метод history().
    Ответ написан
  • Поможете создать текстовый квест на python?

    Vindicar
    @Vindicar
    RTFM!
    Так.
    Но когда дело дошло до переделывания структуры программы - > начались проблемы с не знанием символов, операторов, логических уровней python

    Во-первых, нужно освоить азы языка. Порешайте простые упражения, освойте ветвления, циклы, функции, азы классов. Этого хватит.
    текстовый квест

    Во-вторых, стоит освоить идею конечного автомата (state machine). Это реально очень просто.
    Как освоишь, поймешь, что твой квест - это кучка параллельно работающих конечных автоматов. Один описывает локации мира, другие - состояния отдельных квестов (не начат, находится на том или ином этапе, готов к сдаче, сдан, провален).
    Важный вывод: тебе потребуется как-то хранить эти автоматы так, чтобы к любому из них можно было удобно обратиться из любого места!
    В третьих, осваиваешь State Pattern. Он может пригодиться для реализации мира. По сути, у тебя разные локации будут разными состояниями, и каждая из них может быть представлена как отдельный объект, реагирующий на действия пользователя. Реакция заключается в дергании других автоматов (например, не пускать, пока не пройден квест, или инициировать квест по входу в локацию) и в выводе текста.
    Ты можешь описывать разные локации как разные классы или как разные объекты одного класса.
    Первый подход проще с точки зрения кода, но гораздо более громоздкий, так как на каждую локацию придётся отдельный класс.
    Второй подход сложнее с точки зрения кода, но классов будет меньше, а локации будут представлены данными.
    Я бы начал с первого подхода, чтобы освоиться.
    В-четвёртых, тебе потребуется хранить состояние игрока (и возможно других мобов). Это простые классы, или даже просто словари (dict). Я бы всё же сделал классы.

    Тогда у тебя в программе будет три основных блока.
    1. Интерфейс - кусок кода, который показывает пользователю текующее состояние игры и принимает его ввод, а потом отдаёт этот ввод текущему состоянию игры.
    2. Хранилище автоматов. В первую очередь это автомат навигации по миру, но также и автоматы квестов. Можешь сделать его просто словарём с ключами-строками - так бдует проще.
    3. Данные игрока. Лучше хранить в отдельном классе, но автоматы должны иметь к нему доступ, так или иначе.
    Ответ написан
    2 комментария
  • Как исправить ошибку при создании файла?

    Vindicar
    @Vindicar
    RTFM!
    Если в тексте может быть юникод, то нужно задать кодировку при открытии файла, например, encoding='utf-8'. См. open().
    Ответ написан
    Комментировать
  • Не работает очередь вопроизведения музыки у дискорд бота, что делать?

    Vindicar
    @Vindicar
    RTFM!
    vc.play(source, after = toggle_next)
    await songs.put(vc.play)

    Ты запускаешь воспроизведение вызовом метода vc.play(), а потом помещаешь в очередь ссылку на этот метод.
    Что, по-твоему, сиё должно делать? Потому что оно явно этого не делает, и делать не будет.
    Ответ написан
  • Почему бот discord видит только себя?

    Vindicar
    @Vindicar
    RTFM!
    if collection.find({"_id": member.id}) == None:

    Вот это подозрительно, потому что доки говорят, что find() возвращает курсор. Про None там ни слова.
    Так что вполне может быть, что тебе возвращается пустой курсор - т.е. не None.
    Может, ты имел ввиду find_one()?
    Ответ написан
  • TypeError: TeleBot.send_document() takes 1 positional argument but 3 were given?

    Vindicar
    @Vindicar
    RTFM!
    Проверка на вменяемость: какой пакет стоял на ПК - telebot или pyTelegramBotAPI? Они оба импортируются как telebot, но второй куда популярнее.
    Ответ написан
    6 комментариев
  • Как преобразовать строку в словарь?

    Vindicar
    @Vindicar
    RTFM!
    В питоне есть встроенный модуль json. Первая ссылка в гугле по "python json".
    Ответ написан
    3 комментария
  • Как получить число и подставить в путь файла в aiogram?

    Vindicar
    @Vindicar
    RTFM!
    Ты ошибку-то прочитал? Он прямо говорит, что указанный файл (изображение) не найден.
    Если ты уверен, что файл есть, читай дальше.
    Путь, который ты указал - относительный, поэтому отсчитывается относительно текущей рабочей директории (которая может совпадать или не совпадать с директорией где лежит скрипт, смотря как его запускаешь).
    Так что используй pathlib, чтобы сформировать абсолютный путь к изображению - т.е. начинающийся с корня диска. Если искомый файл лежит неподалёку от каталога бота, то можешь воспользоваться тем фактом, что sys.argv[0] (модуль sys) содержит путь к скрипту бота.
    Ответ написан
    5 комментариев