ТЕЛЕГРАМ БОТ как мне сделать что бы строчки из файлов (по нажатию кнопки) выдавались не рандомно а друг за другом - или сразу все вместе?

Anhex

Новичок
Пользователь
Дек 1, 2021
10
0
1
у меня есть код


Python:
import telebot
import random
from telebot import types
# список 1
f = open('/Users/1/ukrwrite/ch.txt', 'r', encoding='UTF-8')
ch = f.read().split('\n')
f.close()
# список 2 корисне
f = open('/Users/1/ukrwrite/useful.txt', 'r', encoding='UTF-8')
useful  = f.read().split('\n')
f.close()
# список 3 авторки
f = open('/Users/1/ukrwrite/ra.txt', 'r', encoding='UTF-8')
ra  = f.read().split('\n')
f.close()
bot = telebot.TeleBot('.')
@bot.message_handler(commands=["start"])
def start(m, res=False):
        markup=types.ReplyKeyboardMarkup(resize_keyboard=True)
        item1=types.KeyboardButton("челендж")
        item2=types.KeyboardButton("корисне")
        item3 = types.KeyboardButton("рекомендовані авторки")
        markup.add(item1)
        markup.add(item2)
        markup.add(item3)
        bot.send_message(m.chat.id, 'Привіт. ',  reply_markup=markup)
@bot.message_handler(content_types=["text"])
def handle_text(message):
    # якщо 1
    if message.text.strip() == 'челендж' :
            answer = random.choice(ch)
    # якщо 2
    elif message.text.strip() == 'корисне':
          answer = random.choice(useful)

    # якщо 3
    elif message.text.strip() == 'рекомендовані авторки':
         answer = random.choice(ra)
    bot.send_message(message.chat.id, answer)
bot.polling(none_stop=True, interval=0)



как мне сделать что бы строчки из файлов (по нажатию кнопки) выдавались не рандомно а друг за другом - или сразу все вместе? логично что тогда модуль рандома не нужен, но я просто не знаю как написать этот код без него - что бьі все работало. сейчас периодически бот выдает мне строчки из файлов по нажатию кнопки, но потом выдает и ошибку
A request to the Telegram API was unsuccessful. Error code: 400. Description: Bad Request: message must be non-empty
 

robisho

Активный пользователь
Пользователь
Окт 19, 2020
151
26
28
могу порекомендовать использование модуля deque из библиотеки collections

Python:
from collections import deque

array = [1, 2, 3]
q = deque(array)


def get_first_element_in_the_queue(array: list) -> str:
    """
    Return first element in queue
    """
    first_element = array[0]
    array.rotate(-1)
    return first_element

print(get_first_element_in_the_queue(q))  # 1
print(get_first_element_in_the_queue(q))  # 2
print(get_first_element_in_the_queue(q))  # 3
print(get_first_element_in_the_queue(q))  # 1
 

Anhex

Новичок
Пользователь
Дек 1, 2021
10
0
1
могу порекомендовать использование модуля deque из библиотеки collections

Python:
from collections import deque

array = [1, 2, 3]
q = deque(array)


def get_first_element_in_the_queue(array: list) -> str:
    """
    Return first element in queue
    """
    first_element = array[0]
    array.rotate(-1)
    return first_element

print(get_first_element_in_the_queue(q))  # 1
print(get_first_element_in_the_queue(q))  # 2
print(get_first_element_in_the_queue(q))  # 3
print(get_first_element_in_the_queue(q))  # 1
спасибо большое!! а как мне сделать что бы телеграм бот по нажатию кнопки выдавал мне этот список?
 

Anhex

Новичок
Пользователь
Дек 1, 2021
10
0
1
могу порекомендовать использование модуля deque из библиотеки collections

Python:
from collections import deque

array = [1, 2, 3]
q = deque(array)


def get_first_element_in_the_queue(array: list) -> str:
    """
    Return first element in queue
    """
    first_element = array[0]
    array.rotate(-1)
    return first_element

print(get_first_element_in_the_queue(q))  # 1
print(get_first_element_in_the_queue(q))  # 2
print(get_first_element_in_the_queue(q))  # 3
print(get_first_element_in_the_queue(q))  # 1
мой список в смысле, из файла?...
 

robisho

Активный пользователь
Пользователь
Окт 19, 2020
151
26
28
мой список в смысле, из файла?...
читаете файл, формируете список из этого файла, допустим ch. потом создаете очередь из этого списка.
ch_q = deque(ch)
там, где у вас random.choice(ch) заменяете на вызов функции get_first_element_in_the_queue(ch_q). при каждом вызове этой функции будет возвращаться первая строка из очереди, сама очередь будет смещаться на одну строчку. и так со всеми списками.
 

Anhex

Новичок
Пользователь
Дек 1, 2021
10
0
1
читаете файл, формируете список из этого файла, допустим ch. потом создаете очередь из этого списка.
ch_q = deque(ch)
можете пожалуйста показать пример этого кода? 😭
😭 я новичок, шарю плохо(
 

Anhex

Новичок
Пользователь
Дек 1, 2021
10
0
1
читаете файл, формируете список из этого файла, допустим ch. потом создаете очередь из этого списка.
ch_q = deque(ch)
там, где у вас random.choice(ch) заменяете на вызов функции get_first_element_in_the_queue(ch_q). при каждом вызове этой функции будет возвращаться первая строка из очереди, сама очередь будет смещаться на одну строчку. и так со всеми списками.
Код:
import telebot
import random
from telebot import types
from collections import deque
array = [1, 2, 3]
q = deque(array)

def get_first_element_in_the_queue(array: list) -> str:
    """
    Return first element in queue
    """
    first_element = array[0]
    array.rotate(-1)
    return first_element

print(get_first_element_in_the_queue(q))  # 1
print(get_first_element_in_the_queue(q))  # 2
print(get_first_element_in_the_queue(q))  # 3
print(get_first_element_in_the_queue(q))  # 1

bot = telebot.TeleBot('')
@bot.message_handler(commands=["start"])
def start(m, res=False):
        markup=types.ReplyKeyboardMarkup(resize_keyboard=True)
        item1=types.KeyboardButton("челендж")
        item2=types.KeyboardButton("корисне")
        item3 = types.KeyboardButton("рекомендовані авторки")
        markup.add(item1)
        markup.add(item2)
        markup.add(item3)
        bot.send_message(m.chat.id, 'Привіт. ',  reply_markup=markup)
@bot.message_handler(content_types=["text"])
def handle_text(message):
    # якщо 1
    if message.text.strip() == 'челендж' :
            answer = get_first_element_in_the_queue(ch_q)
    # якщо 2ddddddddd
    elif message.text.strip() == 'корисне':
          answer = get_first_element_in_the_queue(useful_q)
    # якщо 3
    elif message.text.strip() == 'рекомендовані авторки':
         answer = get_first_element_in_the_queue(ra_q)
        
    bot.send_message(message.chat.id, answer)
bot.polling(none_stop=True, interval=0)


у меня сейчас вот так, есть три файла из которых надо вывести информацию при нажатии кнопки тґ, как это написать в коде? спасибо
 

robisho

Активный пользователь
Пользователь
Окт 19, 2020
151
26
28
можете пожалуйста показать пример этого кода? 😭
😭 я новичок, шарю плохо(
я понимаю, что новичок. но если вы беретесь за код - вы должны хотя бы приблизительно понимать, что вы делаете. иначе это бесполезный копи-паст.

Python:
import telebot
import random
from telebot import types
from collections import deque


def get_first_element_in_the_queue(array: list) -> str:
    """
    Return first element in queue
    """
    first_element = array[0]
    array.rotate(-1)
    return first_element

# чтение файлов и получение списков
f = open('/Users/1/ukrwrite/ch.txt', 'r', encoding='UTF-8')
ch = f.read().split('\n')
f.close()
# список 2 корисне
f = open('/Users/1/ukrwrite/useful.txt', 'r', encoding='UTF-8')
useful  = f.read().split('\n')
f.close()
# список 3 авторки
f = open('/Users/1/ukrwrite/ra.txt', 'r', encoding='UTF-8')
ra  = f.read().split('\n')
f.close()

# создаем три очереди
ch_q = deque(ch)
useful_q = deque(useful)
ra_q = deque(ra)
    
    
@bot.message_handler(content_types=["text"])
def handle_text(message):
    # якщо 1
    if message.text.strip() == 'челендж' :
        answer = get_first_element_in_the_queue(ch_q)
    # якщо 2ddddddddd
    elif message.text.strip() == 'корисне':
        answer = get_first_element_in_the_queue(useful_q)
    # якщо 3
    elif message.text.strip() == 'рекомендовані авторки':
        answer = get_first_element_in_the_queue(ra_q)
        
    bot.send_message(message.chat.id, answer)
 

Anhex

Новичок
Пользователь
Дек 1, 2021
10
0
1
я понимаю, что новичок. но если вы беретесь за код - вы должны хотя бы приблизительно понимать, что вы делаете. иначе это бесполезный копи-паст.

Python:
import telebot
import random
from telebot import types
from collections import deque


def get_first_element_in_the_queue(array: list) -> str:
    """
    Return first element in queue
    """
    first_element = array[0]
    array.rotate(-1)
    return first_element

# чтение файлов и получение списков
f = open('/Users/1/ukrwrite/ch.txt', 'r', encoding='UTF-8')
ch = f.read().split('\n')
f.close()
# список 2 корисне
f = open('/Users/1/ukrwrite/useful.txt', 'r', encoding='UTF-8')
useful  = f.read().split('\n')
f.close()
# список 3 авторки
f = open('/Users/1/ukrwrite/ra.txt', 'r', encoding='UTF-8')
ra  = f.read().split('\n')
f.close()

# создаем три очереди
ch_q = deque(ch)
useful_q = deque(useful)
ra_q = deque(ra)
   
   
@bot.message_handler(content_types=["text"])
def handle_text(message):
    # якщо 1
    if message.text.strip() == 'челендж' :
        answer = get_first_element_in_the_queue(ch_q)
    # якщо 2ddddddddd
    elif message.text.strip() == 'корисне':
        answer = get_first_element_in_the_queue(useful_q)
    # якщо 3
    elif message.text.strip() == 'рекомендовані авторки':
        answer = get_first_element_in_the_queue(ra_q)
       
    bot.send_message(message.chat.id, answer)
cпасибо огромное((( вроде бы разобралась что к чему но пишет
bot.send_message(message.chat.id, answer)
^^^^^^^
NameError: name 'message' is not defined
 

Форум IT Специалистов