生成折线图发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
相关产品推荐
相关产品推荐

