Python如何搜索文件指定chat_id并读取对应行数据完成值比对
Python实现chat_id匹配与时间戳比对方案
核心实现逻辑
- 逐行读取
keys.txt文件内容,跳过空行 - 利用
ast.literal_eval安全解析每行的元组格式数据,避免字符串拆分带来的格式错误,同时规避eval的代码执行风险 - 对解析出的chat_id做精确等值匹配,避免子串误判(比如搜索ID
546时不会误匹配到54654) - 匹配成功后直接取出元组内的时间戳值,和本地已存储的当前值做比对,根据比对结果走对应业务逻辑
- 遍历完文件未匹配到ID时,走原有新增条目的逻辑分支
现有文件格式说明
keys.txt每行存储一个二元元组字符串,第一个元素为字符串类型的chat_id,第二个元素为浮点型时间戳,样例如下:
('5492828044', 1659360099957.5688) ('54654', 1657397829695.41) ('875186', 1659385033770.0159) ('654564', 1656879437623.957) ('4564564', 1657397840229.474)
可直接运行的完整代码
import ast def match_and_compare(target_chat_id, current_local_ts): target_id = str(target_chat_id) file_ts = None # 上下文管理器自动处理文件关闭,避免资源泄漏 with open('keys.txt', 'r', encoding='utf-8') as f: for line in f: line = line.strip() if not line: continue # 安全解析行内容为元组 chat_id, ts = ast.literal_eval(line) if chat_id == target_id: file_ts = ts break # 未找到匹配ID的分支,对应原代码flag==0的逻辑 if file_ts is None: # 此处填写新增记录的业务代码 print(f"未找到ID为{target_id}的记录,执行新增逻辑") return None # 时间戳比对分支 if file_ts > current_local_ts: # 文件中时间戳更新的处理逻辑 print(f"文件记录更新,文件时间:{file_ts},本地时间:{current_local_ts}") return 1 elif file_ts == current_local_ts: # 时间戳一致的处理逻辑 print(f"记录一致,时间戳为{file_ts}") return 0 else: # 本地时间戳更新的处理逻辑 print(f"本地记录更新,本地时间:{current_local_ts},文件时间:{file_ts}") return -1 # 调用示例 if __name__ == "__main__": # 替换为实际要搜索的chat_id和本地存储的对应时间戳 match_and_compare(target_chat_id=5492828044, current_local_ts=1659360099957.5688)
优化点说明
- 替换原代码的子串匹配逻辑为精确等值匹配,彻底解决ID误匹配问题
- 无需手动维护flag、index计数变量,匹配成功直接break终止遍历,性能更高
- 自动处理空行场景,避免空行导致的解析报错
- 所有文件操作走上下文管理器,不需要手动调用
close(),异常场景下也不会出现文件资源泄漏
内容的提问来源于stack exchange,提问作者Ace
相关产品推荐
相关产品推荐

