设计师网站推荐,网站开发就业薪酬,长春网站建设小程,简单wordpress主题目录 背景分析代码代码解读代码总体结构1. load_pattern_from_excel 函数2. match_and_append_pattern 函数3. main 函数总结 最终的效果#xff1a; 今天不分享netmiko#xff0c;今天分享一个用python提升工作效率的小案例#xff1a;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为第一列的IPvalue为后续的主机信息以列表存储循环对除了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_namepattern)# 将第一列作为字典的键后续列的内容作为值存储在字典中去除NaNpattern {row[0]: [item for item in row[1:] if pd.notna(item)] for row in df.itertuples(indexFalse, nameNone)}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 和 indexsheetsheets_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_namesheet_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, fNew_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_namesheet_name, indexFalse)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文件的 pattern sheet中读取数据并生成一个以字典形式存储的 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_namepattern)# 将第一列作为字典的键后续列的内容作为值存储在字典中去除NaNpattern {row[0]: [item for item in row[1:] if pd.notna(item)] for row in df.itertuples(indexFalse, nameNone)}return pattern功能解释
load_pattern_from_excel 函数的作用是读取Excel文件中特定的sheet在这里是pattern并将其内容格式化为一个字典 pattern。字典的键来自于 pattern sheet 的第一列表示需要在其他工作表中匹配的字符串。字典的值是每行后续列的内容列表并且过滤掉所有 NaN 值。这意味着如果有空白单元格它们不会被纳入到 pattern 中。
实现细节
pd.read_excel(file_path, sheet_namepattern) 读取指定的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 和 indexsheetsheets_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_namesheet_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, fNew_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_namesheet_name, indexFalse)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, fNew_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)功能解释
首先加载 pattern sheet 的内容并生成 pattern 字典。然后调用 match_and_append_pattern 函数对所有目标工作表进行处理并输出结果。
总结
代码逻辑先构建模式数据字典 pattern然后匹配并写入其他工作表。数据写入匹配成功的 value 列表内容依次写入相邻单元格跳过 NaN 值。输出文件最终将处理结果保存到新文件 Updated_ACL.xlsx。
最终的效果 让每一个sheet都如下图一样