网络自动化04:python实现ACL匹配信息(主机与主机信息)
目录
- 背景
- 分析
- 代码
- 代码解读
- 代码总体结构
- 1. `load_pattern_from_excel` 函数
- 2. `match_and_append_pattern` 函数
- 3. `main` 函数
- 总结
- 最终的效果:
今天不分享netmiko,今天分享一个用python提升工作效率的小案例:
acl梳理时的信息匹配。
背景
最近同事在梳理ACL,需要对每一条destination为主机的条目,针对该目的地址主机,标记出这台主机的作用。
工作量大,重复性高,易错率高。
所以使用python进行自动化。
分析
- 首先,同事给出了一版已经做好匹配的文档,如下图(模拟):

- 根据给出的excel,拆分出对应的数据,放在一个sheet中,我这里命名为
pattern
第一列为IP,第二列开始为给出的主机信息:

- 分析python脚本执行思路:
- 读取
patternsheet中的数据,以字典方式存入,key为第一列的IP,value为后续的主机信息(以列表存储); - 循环对
除了pattern sheet的其他sheet,每一行数据的第一列(即acl的每一个rule)去匹配刚刚第一步存储的字典的key,匹配成功后,在这一行后单元格中,填入key对应的value的值。
- 读取
代码
import pandas as pd
import numpy as npdef load_pattern_from_excel(file_path: str) -> dict:"""从指定的Excel文件中读取'pattern'表内容,并返回一个字典。字典的键为第一列的值,值为每行后续列的内容列表(去除NaN)。参数:file_path (str): Excel文件的路径。返回:dict: 包含键值对的字典,键为第一列的内容,值为该行后续列的列表(去除NaN)。"""# 读取Excel文件中的 'pattern' sheetdf = pd.read_excel(file_path, sheet_name='pattern')# 将第一列作为字典的键,后续列的内容作为值存储在字典中,去除NaNpattern = {row[0]: [item for item in row[1:] if pd.notna(item)] for row in df.itertuples(index=False, name=None)}return patterndef 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 = {}# 遍历需要处理的sheetfor sheet_name in sheets_to_process:# 读取当前sheet的数据df = pd.read_excel(xls, sheet_name=sheet_name)# 遍历第一列的每一行,检查是否包含pattern的keyfor 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] = valuestart_col += 1break # 只匹配第一个找到的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)# 进行匹配并更新其他 sheetmatch_and_append_pattern(file_path, pattern)if __name__ == "__main__":main()
代码解读
这版代码实现了从Excel文件中提取特定的模式(pattern),并将这些模式应用到其他工作表中,对匹配的内容进行扩展性写入。以下是对代码的逐步讲解,以便更详细地了解其逻辑和功能:
代码总体结构
load_pattern_from_excel函数:从Excel文件的patternsheet中读取数据,并生成一个以字典形式存储的pattern变量。match_and_append_pattern函数:将pattern变量的内容应用到ACL.xlsx中除pattern和indexsheet之外的所有sheet,找到匹配项后,将模式中对应的内容写入匹配行的指定位置。main函数:作为脚本的主函数,负责调用load_pattern_from_excel和match_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' sheetdf = pd.read_excel(file_path, sheet_name='pattern')# 将第一列作为字典的键,后续列的内容作为值存储在字典中,去除NaNpattern = {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。- 字典的键来自于
patternsheet 的第一列,表示需要在其他工作表中匹配的字符串。 - 字典的值是每行后续列的内容列表,并且过滤掉所有
NaN值。这意味着,如果有空白单元格,它们不会被纳入到pattern中。
实现细节:
pd.read_excel(file_path, sheet_name='pattern')读取指定的Excel文件的patternsheet。- 使用
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 = {}# 遍历需要处理的sheetfor sheet_name in sheets_to_process:# 读取当前sheet的数据df = pd.read_excel(xls, sheet_name=sheet_name)# 遍历第一列的每一行,检查是否包含pattern的keyfor 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] = valuestart_col += 1break # 只匹配第一个找到的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中所有的工作表(除pattern和indexsheet),然后检查每个工作表的第一列中是否包含pattern中的任何键。 - 一旦找到匹配的键,函数会从B列开始,按顺序将
pattern中对应的值逐个写入单元格,每个值占据一个单元格。如果值为NaN则跳过。
实现细节:
- 读取所有工作表:使用
pd.ExcelFile(file_path)读取Excel文件,然后过滤出需要处理的工作表。 - 遍历每个工作表:使用
for sheet_name in sheets_to_process逐个读取并处理每个工作表。 - 匹配和写入数据:
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)。
- 保存更新后的工作表:处理完所有工作表后,将结果保存到新的Excel文件
Updated_ACL.xlsx。
3. main 函数
if __name__ == "__main__":file_path = 'ACL.xlsx'# 加载 pattern 表内容pattern = load_pattern_from_excel(file_path)# 进行匹配并更新其他 sheetmatch_and_append_pattern(file_path, pattern)
功能解释:
- 首先加载
patternsheet 的内容并生成pattern字典。 - 然后调用
match_and_append_pattern函数,对所有目标工作表进行处理并输出结果。
总结
- 代码逻辑:先构建模式数据字典
pattern,然后匹配并写入其他工作表。 - 数据写入:匹配成功的
value列表内容依次写入相邻单元格,跳过NaN值。 - 输出文件:最终将处理结果保存到新文件
Updated_ACL.xlsx。
最终的效果:
让每一个sheet都如下图一样:
相关文章:
网络自动化04:python实现ACL匹配信息(主机与主机信息)
目录 背景分析代码代码解读代码总体结构1. load_pattern_from_excel 函数2. match_and_append_pattern 函数3. main 函数总结 最终的效果: 今天不分享netmiko,今天分享一个用python提升工作效率的小案例:acl梳理时的信息匹配。 背景 最近同事…...
字典树介绍以及C++实现
字典树的概念 字典树(Trie),又称为前缀树或单词查找树,是一种树形数据结构,主要用于存储具有相同前缀的字符串集合。它特别适合用于词典中的单词查找、自动补全、拼写检查等应用。 字典树算法的核心思想就是每层存入…...
【C++】用红黑树封装set和map
在C标准库中,set容器和map容器的底层都是红黑树,它们的各种接口都是基于红黑树来实现的,我们在这篇文章中已经模拟实现了红黑树 ->【C】红黑树,接下来我们在此红黑树的基础上来看看如何封装set和map。 一、共用一颗红黑树 我…...
【大数据测试HDFS + Flask详细教程与实例】
大数据测试HDFS Flask 1. 环境准备安装工具安装Hadoop(以单机模式为例)安装Flask和HDFS Python客户端 2. HDFS Flask基本架构基本文件结构 3. 创建Flask应用与与HDFS交互步骤1:配置HDFS连接步骤2:构建Flask应用 4. 创建前端界面…...
高级java每日一道面试题-2024年10月31日-RabbitMQ篇-RabbitMQ中vhost的作用是什么?
如果有遗漏,评论区告诉我进行补充 面试官: RabbitMQ中vhost的作用是什么? 我回答: 在Java高级面试中,关于RabbitMQ中vhost(虚拟主机)的作用是一个重要且常见的考点。以下是对vhost的详细解释: 一、vhost的基本概念 vhost&am…...
【日常记录-Java】代码配置Logback
1. 简介 在Logback中,推荐使用配置文件(如logback.xml或logback-spring.xml)来设置日志记录的行为。但在实际应用中,会有动态配置logback的需求。此时可通过编程的方式直接操作LoggerContext以及相关的Logger、Appender、Encoder等…...
HTTP常见的请求头有哪些?都有什么作用?在 Web 应用中使用这些请求头?
HTTP 请求头(Request Headers)用于在 HTTP 请求中携带额外的信息,帮助服务器更好地处理请求。以下是一些常见的 HTTP 请求头及其作用: 常见请求头及其作用 1. Accept 作用:告知服务器客户端可以接受的内容类型。示例…...
电信数据清洗案例:利用MapReduce实现高效数据预处理
电信数据清洗案例:利用MapReduce实现高效数据预处理 在大数据时代,电信行业积累了大量的用户通话、短信、上网等行为数据。在数据分析和机器学习模型训练前,对这些数据进行清洗是至关重要的一步。MapReduce 是一种高效的数据处理模型&#x…...
react 中 FC 模块作用
React.FC 是一个泛型类型,用于定义函数组件的类型 一、类型定义和代码可读性 1. 明确组件类型 使用React.FC定义一个组件时,使得组件的输入(props)和输出(返回的 React 元素)都有明确的类型定义。 impo…...
多模态大模型(1)--CLIP
CLIP(Contrastive Language-Image Pre-training)模型是一种多模态预训练神经网络,由OpenAI在2021年发布。它通过对比学习的方式,将图像和文本映射到同一个向量空间中,从而实现跨模态的检索和分类。下面介绍其基础功能&…...
opencv入门学习总结
opencv学习总结 不多bb,直接上代码!!! 案例一: import cv2 # 返回当前安装的 OpenCV 库的版本信息 并且是字符串格式 print(cv2.getVersionString()) """ 作用:它可以读取不同格式的图像文…...
C/C++内存管理 | new的机制 | 重载自己的operator new
一、C/C内存分布 1. 内存分区 栈又叫堆栈–非静态局部变量/函数参数/返回值等等,栈是向下增长的。内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信 .堆用于程序运行时动态内…...
知识库管理系统:企业数字化转型的加速器
在数字化转型的大潮中,知识库管理系统(KBMS)已成为企业提升效率和创新能力的关键工具。本文将探讨知识库管理系统的定义、企业建立知识库的必要性,以及如何快速搭建企业知识库。 知识库管理系统是什么? 知识库管理系统…...
uniapp 如何使用vuex store (亲测)
首先是安装: npm install vuexnext --save 安装之后,Vue2 这样写 不管在哪里,建立一个JS文件,假设命名:store.js 代码这样写: import Vue from vue; import Vuex from vuex;Vue.use(Vuex);const store…...
[编译报错]ImportError: No module named _sqlite3解决办法
1. 问题描述: 在使用python进行代码编译时,提示下面报错: "/home/bspuser/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py", line 18, in <module>import sqlite3File "/usr/local/lib/python2.7/sqlite3/_…...
【旷视科技-注册/登录安全分析报告】
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…...
python学习记录16
字符串总结 python程序使用unicode编码,中文字符与英文字符都占一个字符,但英文字符只占一个字节,中文字符若按照utf-8格式编码占3个字节。 (1)字符串常用方法 1)大小写转化 string.upper()#将所有字母…...
AI 大模型在软件开发中的角色
语法定义的 React 组件。…...
Day62||prim算法精讲 |kruskal算法精讲
prim算法精讲 53. 寻宝(第七期模拟笔试) 题目描述 在世界的某个区域,有一些分散的神秘岛屿,每个岛屿上都有一种珍稀的资源或者宝藏。国王打算在这些岛屿上建公路,方便运输。 不同岛屿之间,路途距离不同&…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
CSS3相关知识点
CSS3相关知识点 CSS3私有前缀私有前缀私有前缀存在的意义常见浏览器的私有前缀 CSS3基本语法CSS3 新增长度单位CSS3 新增颜色设置方式CSS3 新增选择器CSS3 新增盒模型相关属性box-sizing 怪异盒模型resize调整盒子大小box-shadow 盒子阴影opacity 不透明度 CSS3 新增背景属性ba…...
大数据驱动企业决策智能化的路径与实践
📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:数据驱动的企业竞争力重构 在这个瞬息万变的商业时代,“快者胜”的竞争逻辑愈发明显。企业如何在复杂环…...
