Python脚本开发:Policy-map列表合并与匹配查询需求
解决Policy-map合并与匹配的Python脚本问题
我明白你遇到的问题了——你用readlines()拿到了每行组成的列表,但想调用split('end-policy-map')的时候报错,这是因为split()是字符串专属方法,列表并没有这个属性。咱们一步步把这个需求落地:
核心思路
- 先把Policy-map文件的全部内容读取成一个完整字符串,再用
end-policy-map作为分隔符分割,这样每个分割后的片段就是一个完整的Policy-map块。 - 清理这些块的冗余内容(空行、多余空格),整理成结构化的元素。
- 读取参照列表,提取需要匹配的Policy-map名称。
- 遍历整理后的Policy-map块,提取每个块的名称,和参照列表匹配后返回对应内容。
完整代码实现
# 加载并分割Policy-map文件为单个完整块 def load_policy_maps(policy_file_path): with open(policy_file_path, 'r') as f: # 直接读取整个文件为字符串,避免处理列表的麻烦 full_content = f.read() # 用end-policy-map分割,得到每个Policy-map的原始内容 raw_blocks = full_content.split('end-policy-map') # 清理每个块:去掉空行、前后空白,过滤无效空块 cleaned_blocks = [] for block in raw_blocks: # 按行分割,去掉每行的空白,过滤空行 filtered_lines = [line.strip() for line in block.split('\n') if line.strip()] if filtered_lines: # 把清理后的行重新拼接成完整的Policy-map块 cleaned_blocks.append('\n'.join(filtered_lines)) return cleaned_blocks # 读取参照的Policy-map名称列表 def load_reference_policies(ref_file_path): with open(ref_file_path, 'r') as f: # 每行一个名称,去掉空白和换行符,过滤空行 return [line.strip() for line in f if line.strip()] # 匹配参照列表中的Policy-map并返回对应内容 def match_target_policies(policy_blocks, reference_names): matched_policies = [] for block in policy_blocks: # 提取Policy-map名称:假设第一行格式为 "policy-map <NAME>" first_line = block.split('\n')[0] if first_line.startswith('policy-map'): # 分割出名称部分 policy_name = first_line.split('policy-map')[1].strip() # 匹配参照列表 if policy_name in reference_names: matched_policies.append(block) return matched_policies # 示例调用 if __name__ == "__main__": # 替换成你的文件路径 POLICY_FILE = "policy_maps.txt" REFERENCE_FILE = "reference_policies.txt" # 加载数据 all_policies = load_policy_maps(POLICY_FILE) target_list = load_reference_policies(REFERENCE_FILE) # 匹配并输出结果 results = match_target_policies(all_policies, target_list) for idx, policy in enumerate(results, 1): print(f"=== 匹配到的Policy-map #{idx} ===") print(policy) print("\n")
关键细节说明
- 为什么不用
readlines()?:readlines()返回的是每行字符串组成的列表,而split()只能用于单个字符串。直接用f.read()读取整个文件内容作为字符串,是最直接的解决方式。 - 清理块的作用:分割后可能会出现空块(比如文件末尾的
end-policy-map之后没有内容),过滤空行和空白可以避免后续处理出错。 - 名称提取逻辑:这里假设每个Policy-map的第一行是
policy-map <名称>格式,如果你的文件格式有差异(比如带前缀或后缀),可以调整first_line.split()的逻辑来适配。
输入输出示例(参考)
假设你的Policy-map文件内容如下:
policy-map POLICY-1
class CLASS-A
police cir 100000
class CLASS-B
police cir 200000
end-policy-map
policy-map POLICY-2
class CLASS-C
police cir 300000
end-policy-map
参照列表文件内容:
POLICY-1
运行脚本后会输出:
=== 匹配到的Policy-map #1 === policy-map POLICY-1 class CLASS-A police cir 100000 class CLASS-B police cir 200000
内容的提问来源于stack exchange,提问作者Mohideen Pitchai
相关产品推荐
相关产品推荐

