Не удается отправить BytesIO боту Telegram:

#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() также вызывает ошибку