Python实现路由表按CIDR分组存储时文件仅存最后一行问题求助
路由表分类代码问题修复
问题根因
- 每次匹配到符合规则的路由行时,都使用
w+模式打开对应文件,该模式会清空文件原有内容再写入,所以每一次写入都会覆盖上一次的结果,最终文件里只会保留最后一次匹配到的行 - 打开文件后没有主动关闭,会造成资源泄漏
- 重复5次遍历整个路由表,执行效率低
- 原代码中
line + 1属于无意义冗余代码,没有任何实际作用
修正后完整代码
import subprocess import os # 拉取路由表并按行返回 def Call_Routing_Table(): out = subprocess.Popen("route", stdout=subprocess.PIPE) out = out.stdout.read().decode('ascii') return out.splitlines() # 将路由表内容按指定CIDR分组归类 def SortCIDRBlocks(text): # 定义匹配关键词与对应输出文件的映射关系 cidr_rule = { "128.0.0.0": "CIDR1.txt", "192.0.0.0": "CIDR2.txt", "224.0.0.0": "CIDR3.txt", "240.0.0.0": "CIDR4.txt", "255.255.255.0": "CIDR24.txt" } # 初始化结果存储容器 match_result = {key: [] for key in cidr_rule.keys()} # 单次遍历完成所有规则匹配 for line in text: for keyword in cidr_rule: if keyword in line: match_result[keyword].append(line) # 批量写入匹配结果到对应文件 for keyword, match_lines in match_result.items(): if match_lines: # 使用with上下文管理器自动处理文件关闭,避免资源泄漏 with open(cidr_rule[keyword], "w", encoding="ascii") as f: f.write("\n".join(match_lines)) # 查询指定路由 def Pull_Specific_Route(text): word = input('输入要查询的路由关键词:') for line in text: if word in line: print(line) if __name__ == "__main__": # 拉取路由表 lines = Call_Routing_Table() # 按CIDR分组归类 SortCIDRBlocks(lines) # 查询指定路由 Pull_Specific_Route(lines)
优化说明
- 仅需一次遍历即可完成所有规则的匹配,执行效率更高
- 使用
with上下文管理器自动管理文件句柄,避免资源泄漏 - 匹配到的所有行先暂存在列表中,最后一次性写入文件,不会出现内容覆盖的问题
- 新增判断逻辑,只有存在匹配内容时才会生成对应文件,避免生成空文件
- 调整了函数注释为中文,更易读
内容的提问来源于stack exchange,提问作者Saundeep
相关产品推荐
相关产品推荐

