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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 01:48:00