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

    @o5a
    for n in range(100):
        folder_name = f"User{n}"
        # используем нашу folder_name для копирования
    Ответ написан
    Комментировать
  • Ошибка в sqlite3 python?

    @o5a
    Для tik не использован fetchone(), так что в него запишется сам курсор, а не его данные. Но даже в таком случае он текстом должен был написать что-то типа <sqlite3.Cursor ...а не просто пустую строку.
    Лучше сделать этот кусок так:
    ...
          user_info = sql.execute(f"SELECT tiktok, cash from users WHERE login = '{message.from_user.id}'").fetchone()
          if user_info:
              tik, balance = user_info
              bot.send_message(message.chat.id, f"ваш тикток: {tik}")
              bot.send_message(message.chat.id, f" Ваш баланс: {balance} RUB ")
    Ответ написан
    Комментировать
  • Как вывести сообщения сразу для двух переменных chri?

    @o5a
    Не совсем понятно, что значит "сразу для двух переменных". Предположу, что просто адекватная проверка по списку чатов.
    if call.data == 'r':
        status = ['creator', 'administrator', 'member']
        chats = ["@footballdaily24", "@social_net_itnews"]
    
        for chat_id in chats:
            chri == bot.get_chat_member(chat_id=chat_id, user_id=call.from_user.id).status
            if chri not in status:
                bot.send_message(call.message.chat.id, f"Кажется вы не подписались на {chat_id} ")
    Ответ написан
  • Как сделать закрытый Telegram бот?

    @o5a
    def get_access_status(user_id):
        cursor.execute("SELECT 1 FROM Dostyp WHERE Iduser = %s", (user_id, ))
        return bool(cursor.fetchone())
    
    # сам проверка в функции
    @bot.message_handler(commands=['start'])
    def welcome(message):
        if get_access_status(message.from_user.id):
            # доступ есть, продолжаем
    Ответ написан
    Комментировать
  • Как записать в csv на новую строку?

    @o5a
    data = [
    ['13','2да','3нет','4впредкушение','53','654','7русский'],
    ['13','2да','3нет','4влюбленность','50','62','7русский']
    ]
    
    out = [','.join(row)+'\n' for row in data]
    
    with open('document.csv', 'a') as fd:
        fd.writelines(out)

    Но вообще для работы с csv есть встроенная библиотека, через нее удобнее работать напрямую, и можно задавать различные параметры файла (символ разделителя, обрамление кавычками и т.п.)
    import csv
    
    data = [
    ['13','2да','3нет','4впредкушение','53','654','7русский'],
    ['13','2да','3нет','4влюбленность','50','62','7русский']
    ]
    with open('document2.csv', 'w', newline='') as fd:
        writer = csv.writer(fd)
        writer.writerows(data)


    И вообще какое-то странное у Вас представление о формате csv. Зачем у каждого значения приписан его индекс? Обычного так не делается, пишутся просто сами значения, индекс итак известен.
    Ответ написан
    Комментировать
  • Отсортировать массив с вложенным обьектом json?

    @o5a
    Для сортировки можно передавать функцию в параметр key, которая выдаст именно нужный элемент сортировки. Для преобразования даты datetime.strptime с указанием формата.
    print(sorted(data, key=lambda x: datetime.datetime.strptime(x['history_date'], '%d.%m.%Y, %H:%M'), reverse=True))
    Ответ написан
    Комментировать
  • Как одной строчкой вызвать методы из всех экземпляров класса?

    @o5a
    Хранить все эти созданные фигуры в списке, вместо отдельных переменных. Соответственно по списку можно делать массово все, что потребуется.
    import tkinter as tk
    
    root = tk.Tk()
    
    canvas = tk.Canvas(root)
    canvas.pack(fill="both", expand=True)
    # можно хранить в атрибутах canvas
    canvas.max_oval_count = 10
    canvas.ovals = []
    
    class Oval():
        ...
    
    def oval(event):
        # создаем фигуры в списке
        if canvas.max_oval_count > 0:
            canvas.ovals.append(Oval(event, canvas))
            canvas.max_oval_count -= 1
    
    def move_ovals(event):
        for oval in canvas.ovals:
            oval.move_oval(event)
    
    canvas.bind('<Button-3>', oval)
    canvas.bind('<Button-1>', move_ovals)
    
    root.mainloop()
    Ответ написан
    Комментировать
  • Как правильно составить цикл?

    @o5a
    Судя по описанию алгоритма достаточно просто groupby по этим сравниваемым полям
    df.groupby(['id', 'lat/lon']).first().reset_index()
    Ответ написан
    Комментировать
  • Как боту сделать рассылку в телеграмме через python?

    @o5a
    fetchall() в get_subscriptions в текущем виде будет возвращать вложенные списки со всеми полями. Лучше сразу возвращать только нужную информацию - список самих id
    ...
        def get_subscriptions(self, status = True):
            with self.connection:
                return [x[0] for x in self.cursor.execute("SELECT user_id FROM `subscriptions` WHERE `status` = ?", (status,)).fetchall()]

    тогда можно просто напрямую использовать идентификаторы при отправке
    @dp.message_handler(commands=['go'])
    async def go(message: types.Message):
      subscriptions = db.get_subscriptions()
      for user in subscriptions:
        await bot.send_message(user, "...")
    Ответ написан
  • Pandas: как сделать консолидацию по похожим строкам?

    @o5a
    df.groupby(df['Phrase'].str.lower().str.extract(r"(\w+)", expand=False)).sum()

    Подобным образом можно объединить, игнорируя регистр и всякие знаки (т.е. в предложенном примере разделит на 3 группы).
    Но чтобы программа поняла, что "что" и "чта" в одной группе, надо будет добавить или словарь со всеми "синонимами" слов или применять что-нибудь типа nltk (но вроде он тоже "чта" не поймет как "что").
    Если же в реальности там именно целые предложения, то тогда без nltk скорее всего не обойтись, но и он однозначно тоже не сможет понять эти "чта" скорее всего.
    Ответ написан
  • Как ограничить отправку в боте Telegram?

    @o5a
    Без кода сложно что-то однозначное сказать, но можете выставлять статус по пользователям (хотя бы просто словарь с данными). Обработка началась - выставляете пользователю статус, что обрабатывается запрос. И пока статус стоит, другая команда не выполняется. По окончании обработки статус сбрасывается. Условно:
    user_status = {}
    
    @bot.message_handler ...
    def process_something(message):
        if user_status.get(message.from_user.id, 0) == 0:
            user_status[message.from_user.id] == 1
            start_our_process()
    Ответ написан
    Комментировать
  • Как разобрать команду на данные?

    @o5a
    @bot.message_handler(regexp=r"/\w\d+")
    def get_info(message):
        user_type = message.text[1:2]
        user_num = int(message.text[2:])
        print(user_type, user_num)
        bot.send_message(message.chat.id, f'ты запросил {user_type} - {user_num}')

    Только этот хендлер надо помещать ДО хендлера общего текста (message_handler(content_types=['text'])
    Ответ написан
    Комментировать
  • Не работает функция как надо,что делать?

    @o5a
    def starvation_system():
        db = sqlite3.connect("base.db") # подключение базы данных.
        sql = db.cursor()
        sql.execute("UPDATE users SET golod = golod - 10")
        db.commit()
    Ответ написан
    Комментировать
  • Telegram bot с Tesseract на борту не хочет работать, пожалуйста просмотрите мой код?

    @o5a
    Логично, что такие ошибки, если не придерживаться одного цикла. Этот фрагмент
    ...
            for plate in plates:
                x, y, w, h = plate
            centreX = int((x + (x + w)) / 2)
    ...

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

    @o5a
    Странно сформулированный вопрос. Требуется записать список из чисел в файл или что?
    data = [80,125,0]
    with open("newfile.txt", "w") as f:
        f.writelines((f"{x}\n" for x in data))

    или так
    data = [80,125,0]
    with open("newfile.txt", "w") as f:
        f.write("\n".join(map(str, data)))

    или так
    data = [80,125,0]
    with open("newfile.txt", "w") as f:
       print(*data, file=f, sep='\n')
    Ответ написан
  • Как вставить данные в таблицу на python?

    @o5a
    В этой системе подразумевается, что каждый ответ пользователя будет складываться в глобальный словарь данных о пользователе user_data, а в самом конце информация из словаря запишется в БД. Но в Вашем коде эта запись в словарь пропущена.
    @bot.message_handler(commands=['start', 'help'])
    def send_welcome(message):
            msg = bot.send_message(message.chat.id, "Введите ваши Фамилию, Имя, Отчество")
            bot.register_next_step_handler(msg, send_phone)
    
    def send_phone(message):
        # в message.text будет содержаться ФИО пользователя, т.к. сюда мы пришли из send_welcome
        # их и надо записать в словарь данных, первый раз с созданием нового пользователя
        user_data[message.from_user.id] = User(message.text)
        msg = bot.send_message(message.chat.id, "Введите ваш номер телефона:")
        bot.register_next_step_handler(msg, send_dog)
    
    def send_dog(message):
        # на этом этапе пользователь уже создан, просто дополняем информацию (на данном этапе это номер телефона)
        user_data[message.from_user.id].phone_number = message.text
        msg = bot.send_message(message.chat.id, "Как зовут вашего питомца?")
        bot.register_next_step_handler(msg, send_breed_dog)
    
    # аналогично с последующими шагами. нужно сохранять переданные пользователем данные
    
    # и на последнем этапе просто достаем всю информацию по пользователю
    def process_lastname_step(message):
        try:
            user_id = message.from_user.id
            user = user_data[user_id]
    
            # все эти присваивания user.phone_number уже не нужны, информация итак есть в user (т.к. это экземпляр класса User), используем ее напрямую
            #user.first_name = message.text
            #user.phone_namber = message.text
            #user.dog = message.text
            #user.breed_dog = message.text
            #user.club_name = message.text
            #user.club_namber = message.text
    
            sql = "INSERT INTO users (first_name, phone_namber, dog, breed_dog, club_name, club_namber, user_id ) VALUES (%s, %s, %s, %s ,%s , %s, %s)"
            val = (user.first_name, user.phone_namber, user.dog, user.breed_dog, user.club_name, user.club_namber, user_id)
            cursor.execute(sql, val)
            ...
    Ответ написан
    Комментировать
  • Как вывести самую длинную цепочку из символов в алфавитном порядке?

    @o5a
    Проблема из-за условия проверки
    if ord(text[i + j]) - ord(elems[-1][-1]) < 2
    в условии последовательности требуется, чтобы последующая буква была не меньше предыдущей, не понятно, с чего Вы вдруг такое условие написали.

    Вообще нет надобности сохранять куда-то сами последовательности, тем более, что требуется только первую из самых длинных. Как можно это сделать:
    Проходим по символам последовательности и проверяем, стал ли ord() текущего символа меньше предыдущего. Если стал, то последовательность закончилась. Проверяем, не стала ли эта последовательность больше предыдущей. Если да, обновляем данные максимальной последовательности (стартовую позицию и длину).
    В противном случае переходим к следующему.
    Примерно так:
    spoiler
    text = ...
    text_len = len(text)
    max_len = 0
    max_idx = 0
    seq_idx = 0
    prev = 0
    
    for i, x in enumerate(text):
        if ord(x) < prev:
            seq_len = i-seq_idx
            if seq_len > max_len:
                max_len = seq_len
                max_idx = seq_idx
            seq_idx = i
        elif i==text_len-1:
            seq_len = i-seq_idx+1
            if seq_len > max_len:
                max_len = seq_len
                max_idx = seq_idx
        prev = ord(x)
    print(max_len, text[max_idx:max_idx+max_len])
    Ответ написан
    Комментировать
  • Как распознавать дин. команды боту?

    @o5a
    Если xxx это просто параметр поиска, то его можно передавать через пробел. Тогда команда будет универсальная, а аргумент можно вытащить из строки.
    @bot.message_handler(commands=['search'])
    def search(message):
      if ' ' in message.text:
        param = message.text.split(maxsplit=1)[1]
        ...
      else:
        bot.send_message(message.chat.id, 'no params')

    Будет понимать команды вида
    /search XXX
    Ответ написан
    Комментировать
  • Как продолжить выполнение программы Python при ошибке в цикле FOR?

    @o5a
    for ftid in range(begin_ftid, end_ftid):
        while True:
            try:
                f1(ftid)
                f2(ftid)
                f3(ftid)
    
            except Exception:
                time.sleep(5)
                continue
            break
    Ответ написан
    Комментировать