#python #telegram #telegram-bot #python-telegram-bot
#python #telegram #telegram-бот #python-telegram-bot
Вопрос:
Ситуация.
Мне нужно создать csv-файл в памяти и отправить его боту.
Согласно этой статье и документации бота, я предполагаю, что могу отправлять CSV-файлы. Разница: я использую другую оболочку api: telebot. Согласно документам, он также позволяет отправлять двоичные файлы. Итак, я пытаюсь протестировать это так:
def test_buf():
import csv
import io
test_data = [[1, 2, 3], ["a", "b", "c"]]
# csv module can write data in io.StringIO buffer only
s = io.StringIO()
csv.writer(s).writerows(test_data)
s.seek(0)
# python-telegram-bot library can send files only from io.BytesIO buffer
# we need to convert StringIO to BytesIO
buf = io.BytesIO()
# extract csv-string, convert it to bytes and write to buffer
buf.write(s.getvalue().encode())
buf.seek(0)
# set a filename with file's extension
buf.name = 'test_data.csv'
return buf
И затем
csv_output = test_buf()
bot.send_document(chat_id, csv_output, caption='Caption_text')
И я получаю сообщение об ошибке:
"ApiTelegramException occurred, args=("A request to the Telegram API was unsuccessful. Error code: 400 Description: Bad Request: can't parse entities: Can't find end of the entity starting at byte offset 7",)
Что я делаю не так? Может быть, я не до конца понимаю разницу между BytesIO и двоичным форматом? Если это по-другому, как преобразовать bytesio в двоичный файл в памяти, чтобы я мог отправлять данные
На данный момент я могу отправить файл, но без библиотеки telebot:
requests.post(f'https://api.telegram.org/bot{TELEGRAM_TOKEN}/sendDocument',
data={"chat_id": chat_id, "caption": 'caption_text'},
files={'document': csv_output})
Поэтому я не понимаю, в чем проблема с библиотекой. Похоже, я уверен, что просто не понимаю некоторых базовых вещей.
Комментарии:
1. Вы пробовали отправлять содержимое байтбуфера вместо самого объекта?
buf.getvalue()
. ссылка на документацию функции была бы полезной, общий readme не очень полезен2. @fibonachoceres с помощью buf.get_value() также вызывает ошибку