Python+Telethon出现database is locked错误的解决方法
解决Telethon的
sqlite3.OperationalError: database is locked错误 错误原因
你代码里同时初始化了两个使用同一个session文件的TelegramClient实例:
- 先创建了
client = TelegramClient('test', api_id, api_hash) - 又在for循环里用
with TelegramClient('test', api_id, api_hash) as client:重新创建实例
Telethon的sqlite session不允许多个客户端同时读写同一个session数据库,这就导致了数据库锁定的错误。
修复方案
只初始化一次TelegramClient,把所有聊天的消息获取逻辑放在同一个客户端连接里执行,避免重复创建实例占用session数据库。
修改后的代码如下:
from telethon.sync import TelegramClient import datetime import pandas as pd api_id = 11874123 api_hash = '7d78879e63e0b956d5g77575e4665ba3' chats = ['waqarzaka'] df = pd.DataFrame() # 只初始化一次客户端,在with语句内处理所有聊天 with TelegramClient('test', api_id, api_hash) as client: for chat in chats: for message in client.iter_messages(chat, offset_date=datetime.date.today(), reverse=True): print(message) data = { "group" : chat, "sender" : message.sender_id, "text" : message.text, "date" : message.date } temp_df = pd.DataFrame(data, index=[1]) df = pd.concat([df, temp_df], ignore_index=True) # 推荐用concat替代append,append已被弃用 df['date'] = df['date'].dt.tz_localize(None) df.to_excel("C:\\crypto\\data_{}.xlsx".format(datetime.date.today()), index=False)
额外优化点
- 替换
df.append(temp_df)为pd.concat([df, temp_df], ignore_index=True),因为append方法在Pandas 2.0+中已经被弃用,使用concat更稳定。 - 移除了多余的
client = TelegramClient('test', api_id, api_hash)语句,避免不必要的资源占用。
内容的提问来源于stack exchange,提问作者Ahsan Khan
相关产品推荐
相关产品推荐

