网络自动化04:python实现ACL匹配信息(主机与主机信息)

news2024/11/13 15:48:20

目录

  • 背景
  • 分析
  • 代码
    • 代码解读
      • 代码总体结构
      • 1. `load_pattern_from_excel` 函数
      • 2. `match_and_append_pattern` 函数
      • 3. `main` 函数
      • 总结
    • 最终的效果:

今天不分享netmiko,今天分享一个用python提升工作效率的小案例:acl梳理时的信息匹配

背景

最近同事在梳理ACL,需要对每一条destination主机的条目,针对该目的地址主机,标记出这台主机的作用。
工作量大,重复性高,易错率高。
所以使用python进行自动化。

分析

  1. 首先,同事给出了一版已经做好匹配的文档,如下图(模拟):
    在这里插入图片描述
  2. 根据给出的excel,拆分出对应的数据,放在一个sheet中,我这里命名为pattern
    第一列为IP,第二列开始为给出的主机信息:
    在这里插入图片描述
  3. 分析python脚本执行思路:
    1. 读取patternsheet中的数据,以字典方式存入,key为第一列的IP,value为后续的主机信息(以列表存储);
    2. 循环对除了pattern sheet的其他sheet,每一行数据的第一列(即acl的每一个rule)去匹配刚刚第一步存储的字典的key,匹配成功后,在这一行后单元格中,填入key对应的value的值。

代码

import pandas as pd
import numpy as np

def load_pattern_from_excel(file_path: str) -> dict:
    """
    从指定的Excel文件中读取'pattern'表内容,并返回一个字典。
    字典的键为第一列的值,值为每行后续列的内容列表(去除NaN)。
    
    参数:
        file_path (str): Excel文件的路径。
    
    返回:
        dict: 包含键值对的字典,键为第一列的内容,值为该行后续列的列表(去除NaN)。
    """
    # 读取Excel文件中的 'pattern' sheet
    df = pd.read_excel(file_path, sheet_name='pattern')

    # 将第一列作为字典的键,后续列的内容作为值存储在字典中,去除NaN
    pattern = {row[0]: [item for item in row[1:] if pd.notna(item)] for row in df.itertuples(index=False, name=None)}
    
    return pattern

def match_and_append_pattern(file_path: str, pattern: dict):
    """
    读取Excel文件中除'pattern'和'indexsheet'之外的所有sheet,
    检查第一列是否包含pattern中的key,匹配后将对应value的每个元素写入相邻单元格(跳过NaN)。
    
    参数:
        file_path (str): Excel文件的路径。
        pattern (dict): 包含匹配模式的字典,键为要匹配的字符串,值为需要写入的列表(无NaN)。
    """
    # 读取Excel文件
    xls = pd.ExcelFile(file_path)
    
    # 获取所有sheet名称,排除 'pattern' 和 'indexsheet'
    sheets_to_process = [sheet for sheet in xls.sheet_names if sheet not in ['pattern', 'indexsheet']]
    
    # 创建一个字典来存储每个sheet的更新内容
    updated_sheets = {}

    # 遍历需要处理的sheet
    for sheet_name in sheets_to_process:
        # 读取当前sheet的数据
        df = pd.read_excel(xls, sheet_name=sheet_name)
        
        # 遍历第一列的每一行,检查是否包含pattern的key
        for idx, cell_value in enumerate(df.iloc[:, 0]):
            for key, values in pattern.items():
                if key in str(cell_value):  # 检查第一列单元格是否包含key
                    # 在匹配的行写入values中的每个非NaN元素
                    start_col = 1  # 从B列开始写入
                    for value in values:
                        if pd.notna(value):  # 仅写入非NaN的值
                            if start_col >= df.shape[1]:
                                df.insert(start_col, f'New_Col_{start_col}', None)  # 添加新列
                            df.iat[idx, start_col] = value
                            start_col += 1
                    break  # 只匹配第一个找到的key并写入
        
        # 将更新后的DataFrame存储到字典中
        updated_sheets[sheet_name] = df
    
    # 将更新后的内容写回到新的Excel文件中
    with pd.ExcelWriter('Updated_ACL.xlsx') as writer:
        for sheet_name, updated_df in updated_sheets.items():
            updated_df.to_excel(writer, sheet_name=sheet_name, index=False)
    
    print("匹配和追加已完成,文件已保存为 'Updated_ACL.xlsx'.")

def main():
    file_path = 'ACL.xlsx'
    
    # 加载 pattern 表内容
    pattern = load_pattern_from_excel(file_path)
    
    # 进行匹配并更新其他 sheet
    match_and_append_pattern(file_path, pattern)

if __name__ == "__main__":
    main()

代码解读

这版代码实现了从Excel文件中提取特定的模式(pattern),并将这些模式应用到其他工作表中,对匹配的内容进行扩展性写入。以下是对代码的逐步讲解,以便更详细地了解其逻辑和功能:

代码总体结构

  1. load_pattern_from_excel 函数:从Excel文件的 pattern sheet中读取数据,并生成一个以字典形式存储的 pattern 变量。
  2. match_and_append_pattern 函数:将 pattern 变量的内容应用到 ACL.xlsx 中除 patternindexsheet 之外的所有sheet,找到匹配项后,将模式中对应的内容写入匹配行的指定位置。
  3. main 函数:作为脚本的主函数,负责调用 load_pattern_from_excelmatch_and_append_pattern 函数,完成整个流程。

1. load_pattern_from_excel 函数

def load_pattern_from_excel(file_path: str) -> dict:
    """
    从指定的Excel文件中读取'pattern'表内容,并返回一个字典。
    字典的键为第一列的值,值为每行后续列的内容列表(去除NaN)。
    
    参数:
        file_path (str): Excel文件的路径。
    
    返回:
        dict: 包含键值对的字典,键为第一列的内容,值为该行后续列的列表(去除NaN)。
    """
    # 读取Excel文件中的 'pattern' sheet
    df = pd.read_excel(file_path, sheet_name='pattern')

    # 将第一列作为字典的键,后续列的内容作为值存储在字典中,去除NaN
    pattern = {row[0]: [item for item in row[1:] if pd.notna(item)] for row in df.itertuples(index=False, name=None)}
    
    return pattern

功能解释

  • load_pattern_from_excel 函数的作用是读取Excel文件中特定的sheet(在这里是pattern)并将其内容格式化为一个字典 pattern
  • 字典的键来自于 pattern sheet 的第一列,表示需要在其他工作表中匹配的字符串。
  • 字典的值是每行后续列的内容列表,并且过滤掉所有 NaN。这意味着,如果有空白单元格,它们不会被纳入到 pattern 中。

实现细节

  • pd.read_excel(file_path, sheet_name='pattern') 读取指定的Excel文件的 pattern sheet。
  • 使用 itertuples 遍历每一行,并构建一个字典推导式 {row[0]: [item for item in row[1:] if pd.notna(item)]},通过列表推导式过滤掉 NaN 值。

2. match_and_append_pattern 函数

def match_and_append_pattern(file_path: str, pattern: dict):
    """
    读取Excel文件中除'pattern'和'indexsheet'之外的所有sheet,
    检查第一列是否包含pattern中的key,匹配后将对应value的每个元素写入相邻单元格(跳过NaN)。
    
    参数:
        file_path (str): Excel文件的路径。
        pattern (dict): 包含匹配模式的字典,键为要匹配的字符串,值为需要写入的列表(无NaN)。
    """
    # 读取Excel文件
    xls = pd.ExcelFile(file_path)
    
    # 获取所有sheet名称,排除 'pattern' 和 'indexsheet'
    sheets_to_process = [sheet for sheet in xls.sheet_names if sheet not in ['pattern', 'indexsheet']]
    
    # 创建一个字典来存储每个sheet的更新内容
    updated_sheets = {}

    # 遍历需要处理的sheet
    for sheet_name in sheets_to_process:
        # 读取当前sheet的数据
        df = pd.read_excel(xls, sheet_name=sheet_name)
        
        # 遍历第一列的每一行,检查是否包含pattern的key
        for idx, cell_value in enumerate(df.iloc[:, 0]):
            for key, values in pattern.items():
                if key in str(cell_value):  # 检查第一列单元格是否包含key
                    # 在匹配的行写入values中的每个非NaN元素
                    start_col = 1  # 从B列开始写入
                    for value in values:
                        if pd.notna(value):  # 仅写入非NaN的值
                            if start_col >= df.shape[1]:
                                df.insert(start_col, f'New_Col_{start_col}', None)  # 添加新列
                            df.iat[idx, start_col] = value
                            start_col += 1
                    break  # 只匹配第一个找到的key并写入
        
        # 将更新后的DataFrame存储到字典中
        updated_sheets[sheet_name] = df
    
    # 将更新后的内容写回到新的Excel文件中
    with pd.ExcelWriter('Updated_ACL.xlsx') as writer:
        for sheet_name, updated_df in updated_sheets.items():
            updated_df.to_excel(writer, sheet_name=sheet_name, index=False)
    
    print("匹配和追加已完成,文件已保存为 'Updated_ACL.xlsx'.")

功能解释

  • 该函数的主要功能是遍历 ACL.xlsx 中所有的工作表(除 patternindexsheet),然后检查每个工作表的第一列中是否包含 pattern 中的任何键。
  • 一旦找到匹配的键,函数会从B列开始,按顺序将 pattern 中对应的值逐个写入单元格,每个值占据一个单元格。如果值为 NaN 则跳过。

实现细节

  1. 读取所有工作表:使用 pd.ExcelFile(file_path) 读取Excel文件,然后过滤出需要处理的工作表。
  2. 遍历每个工作表:使用 for sheet_name in sheets_to_process 逐个读取并处理每个工作表。
  3. 匹配和写入数据
    • for idx, cell_value in enumerate(df.iloc[:, 0]) 遍历第一列的每一行,检查每个单元格是否包含 pattern 中的任何键。
    • 如果匹配成功,则按顺序将 values 列表中的每个元素写入到匹配行的相邻单元格,从 B 列开始(即 start_col = 1)。
    • 在写入时,使用 pd.notna(value) 跳过 NaN 值。
    • 如果需要的列数超过现有列,则动态添加新列 df.insert(start_col, f'New_Col_{start_col}', None)
  4. 保存更新后的工作表:处理完所有工作表后,将结果保存到新的Excel文件 Updated_ACL.xlsx

3. main 函数

if __name__ == "__main__":
    file_path = 'ACL.xlsx'
    # 加载 pattern 表内容
    pattern = load_pattern_from_excel(file_path)
    # 进行匹配并更新其他 sheet
    match_and_append_pattern(file_path, pattern)

功能解释

  • 首先加载 pattern sheet 的内容并生成 pattern 字典。
  • 然后调用 match_and_append_pattern 函数,对所有目标工作表进行处理并输出结果。

总结

  • 代码逻辑:先构建模式数据字典 pattern,然后匹配并写入其他工作表。
  • 数据写入:匹配成功的 value 列表内容依次写入相邻单元格,跳过 NaN 值。
  • 输出文件:最终将处理结果保存到新文件 Updated_ACL.xlsx

最终的效果:

让每一个sheet都如下图一样:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2239487.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何查看电脑关机时间

要查看电脑的关机时间,可以按照以下步骤进行操作: 1. 打开事件查看器:按下键盘上的Windows键R键,然后在弹出的运行对话框中输入"eventvwr.msc",并按下Enter键。 2. 在事件查看器窗口中,单击左侧窗…

3DTiles之i3dm介绍

3DTiles之i3dm介绍 3D Tiles 是一种用于高效存储和传输三维城市、建筑、地形、点云等空间数据的开放标准格式。i3dm(Intel 3D Model)是 3D Tiles 中用于表示三维模型(如建筑物或其他对象)的一个子格式。i3dm 格式的出现&#xff…

Java | Leetcode Java题解之第559题N叉树的最大深度

题目&#xff1a; 题解&#xff1a; class Solution {public int maxDepth(Node root) {if (root null) {return 0;}Queue<Node> queue new LinkedList<Node>();queue.offer(root);int ans 0;while (!queue.isEmpty()) {int size queue.size();while (size &g…

【机器学习入门】(1) 线性回归算法

学习目标&#xff1a; 线性回归是一种基本的统计学习方法&#xff0c;主要用于分析一个或多个自变量与因变量之间的线性关系。以下是关于线性回归的一些关键点&#xff1a;线性回归的四要素&#xff1a; &#xff08;1&#xff09;假设(hypothesis)&#xff1b;&#xff08;2&…

视频会议接入GB28181视频指挥调度,语音对讲方案

传统的视频会议指挥调度系统目前主流的互联网会议大部分都是私有协议&#xff0c;功能都很独立。目前主流的视频监控国标都最GB平台&#xff0c;新的需求要求融合平台要接入监控等设备&#xff0c;并能实现观看监控接入会议&#xff0c;实时语音设备指挥现场工作人员办公实施。…

一文1800字使用Jmeter进行http接口性能测试!

接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 为什么要做接口测试&#xff1f; 越底层发现b…

搭建监控系统Prometheus + Grafana

公司有个技术分享会&#xff0c;但是业务忙&#xff0c;没时间精心准备&#xff0c;所以就匆匆忙忙准备分享一下搭建&#xff08;捂脸哭&#xff09;。技术含量确实不多&#xff0c;但是分享的知识确实没问题。 以下是搭建过程&#xff1a; 一、讲解 Prometheus Prometheus 最…

ArkTS中的自定义构建函数、Tab栏和组件状态共享

一、自定义构建函数 1.构建函数 Builder 1.1 介绍 文档地址&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-builder-V5?catalogVersionV5 概念&#xff1a;ArkUI提供了一种轻量的UI元素复用机制Builder&#xff0c;可以将重复使用的U…

二维、三维情况下的锚点优选方法

多锚点定位时&#xff0c;锚点的选择对定位精度有重要影响。下面介绍基于误差最小化的锚点选择的相应公式和MATLAB代码示例&#xff0c;并进行详细分析 文章目录 方法描述代码MATLAB代码示例代码运行结果 总结 方法描述 选择能够最小化定位误差的锚点组合。通过计算锚点位置与…

CCF ChinaOSC |「开源科学计算与系统建模openSCS专题分论坛」11月9日与您相约深圳

2024年11月9日至10日&#xff0c;以“湾区聚力 开源启智”为主题的2024年中国计算机学会中国开源大会&#xff08;CCF ChinaOSC&#xff09;将在深圳召开。大会将汇聚国内外学术界、顶尖科技企业、科研机构及开源社区的精英力量&#xff0c;共同探索人工智能技术和人类智慧的无…

力扣102:二叉树的层次遍历

给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]]示例 2&#xff1a; 输入&a…

数学建模模型算法-Python实现

一、评价决策类 1、层次分析法&#xff08;AHP&#xff09; 层次分析法用来评价或选择一个更好更优的决策或方案 通过找到可以衡量其好坏的指标&#xff0c;进而衡量指标&#xff0c;再形成评价体系 归一化处理 让指标在同一数量级&#xff0c;且保证在同一指标下其差距保持…

linux-vlan(1)

# VLAN # 1.topo # 2.创建命名空间 ip netns add ns1 ip netns add ns2 ip netns add ns3 # 3.创建veth设备 ip link add ns1-veth0 type veth peer name ns21-veth0 ip link add ns3-veth0 type veth peer name ns23-veth0 # 4.veth设备放入命名空间,启动接口 ip link set n…

spring cloud 入门笔记1(RestTemplate,Consul)

最大感受&#xff1a; spring cloud无非是将spring boot中的各个工作模块拆分成独立的小spring boot&#xff0c;各个模块之间&#xff0c;不再是通过导包什么的&#xff0c;调用而是通过网路进行各个模块之间的调用 工具一&#xff1a;RestTemplate 在Java代码中发送HTTP请…

FlinkSql读取kafka数据流的方法(scala)

我的scala版本为2.12 <scala.binary.version>2.12</scala.binary.version> 我的Flink版本为1.13.6 <flink.version>1.13.6</flink.version> FlinkSql读取kafka数据流需要如下依赖&#xff1a; <dependency><groupId>org.apache.flink&…

Docker 安装Immich教程

Immich 是一个开源的自托管照片和视频管理平台,专为帮助用户存储、管理、和分享个人媒体库而设计。Immich 的目标是提供一个类似 Google Photos 的替代方案,但不依赖于第三方服务,用户可以完全控制自己的数据。 本章教程,记录如何用Docker部署安装Immich,使用的操作系统的…

【CICD】CICD 持续集成与持续交付在测试中的应用

一、什么是CICD&#xff1f; CI/CD 是指持续集成&#xff08;Continuous Integration&#xff09;和持续部署&#xff08;Continuous Deployment&#xff09;或持续交付&#xff08;Continuous Delivery&#xff09; 1.1 持续集成&#xff08;Continuous Integration&#xf…

交友问题 | 动态规划

描述 如果有n个人&#xff0c;每个人都可以保持单身或与其他人结成一对。每个人只能找一个对象。求总共有多少种保持单身或结对的方式。用动态规划求解。 输入 输入第一行t表示测试用例的数量 对于每一个测试用例, 输入一个整数n表示人数1<n<18 输出 针对每个测试用…

Web开发:ABP框架6——appsetting.json的读取以及实例的注入

目录 一、模块配置服务 二、配置服务的编写&#xff08;配置ORM&#xff09; 三、高层代码的运用&#xff08;ORM实例查询 & 获取字符串&#xff09; 一、模块配置服务 BookStoreHttpApiHostModule 二、配置服务的编写&#xff08;配置ORM&#xff09; (以freesql为例子…

tomcat启动运行乱码,解决方案

tomcat启动运行乱码,解决方案 不要修改系统设置;我们是要让tomcat兼容我们系统,不是让系统兼容tomcat。不要修改系统设置;我们是要让tomcat兼容我们系统,不是让系统兼容tomcat。不要修改系统设置;我们是要让tomcat兼容我们系统,不是让系统兼容tomcat。解决方案 找到你的…