You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

生成折线图发Telegram二次报错,如何检查io.BytesIO的seek光标位置为0?

解决方案:检查BytesIO光标位置并修复Telegram发送错误

检查光标位置的方法

要确认io.BytesIO对象的光标是否处于起始位置,直接调用tell()方法即可,它会返回当前光标所在的字节位置:

current_position = plot_object.tell()
if current_position == 0:
    print("光标在起始位置")
else:
    print(f"光标当前位置:{current_position}")

修复第二次发送报错的问题

你遇到的BadRequest: File must be non-empty错误,原因是第一次发送后,Telegram的sendPhoto方法会读取BytesIO对象直到末尾,此时光标停留在文件结尾。第二次复用该对象时,若未重置光标位置,就会出现无内容可读的情况。

方案1:发送前强制重置光标

在每次调用sendPhoto前,确保光标回到起始位置:

sns.lineplot(x=x, y=y);
plt.title('test plot');

plot_object = io.BytesIO()
plt.savefig(plot_object)
plot_object.name = 'test_plot.png'
plt.close()

# 发送前重置光标到起始位置
plot_object.seek(0)
bot.sendPhoto(chat_id, plot_object)

方案2:每次生成新的BytesIO对象(更稳妥)

避免复用同一个BytesIO对象,每次生成图表时创建新的实例,确保每次发送的都是完整的文件内容:

def send_line_plot(x, y, chat_id):
    sns.lineplot(x=x, y=y)
    plt.title('test plot')
    
    # 每次新建BytesIO对象
    plot_object = io.BytesIO()
    plt.savefig(plot_object)
    plot_object.seek(0)
    plot_object.name = 'test_plot.png'
    plt.close()
    
    bot.sendPhoto(chat_id, plot_object)

# 第一次发送
send_line_plot(x_data1, y_data1, chat_id)
# 第二次发送
send_line_plot(x_data2, y_data2, chat_id)

内容的提问来源于stack exchange,提问作者John Doe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 00:32:20