做图片类型网站需要什么服务器seo运营经理
目录
- 背景
 - 分析
 - 代码
 - 代码解读
 - 代码总体结构
 - 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都如下图一样:
