首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:将数据作为变量从csv中提取并插入到基本文件中(凝固汽油吐露)

Python:将数据作为变量从csv中提取并插入到基本文件中(凝固汽油吐露)
EN

Stack Overflow用户
提问于 2020-08-20 18:34:12
回答 1查看 192关注 0票数 0

问题:我试图使用一个包含每个设备的可变信息的基本模板对一些网络设备进行大规模编码。当前的编码不能很好地扩展,特别是在配置文件中分配来自.csv的变量和用所述变量替换文本是在我开始研究10+变量时似乎不必要地庞大的部分。例如(变量=行‘列名’)和(data =data.replace(‘{变量}’,变量))

从.csv中的每一列自动生成基本变量将完全转义我。有几个变量是生成的变量的组合似乎是可以的。对于替换部分,我考虑了将变量放在列表中并在列表中迭代,因为名称是相同的,但是除了手动编码列表之外,我想不出一种方法。

我选择了熊猫和csv,因为我喜欢它的代码看起来是如此的简洁和简洁。我还做了一些测试,从csv中提取数据,并写了大约20行左右的行来比较它们之间的差异,并看到了两种方法之间大约2秒的差别。我从来没有见过一次向超过25到50台设备推介新的信息,数据与csv的读写是可以忽略不计的,但我可能弄错了。

=========================================================================

对于参考,凝固汽油弹以下列方式从文件中读取配置:

代码语言:javascript
复制
driver = get_network_driver("ios")
with driver(IP, Username, Password) as device:
   device.load_merge_candidate(filename='Config.cfg')

Config.cfg文件只是一个装载了ios命令的文件,但是要对多个设备进行编程,我需要遍历一个.csv文件,该文件中填充了配置文件中替换所需的变量。

基本配置文件示例

Base_Config.cfg

代码语言:javascript
复制
hostname {hostname}
spanning-tree mode rapid-pvst
udld enable
interface vlan {managementVLAN}
ip address {managementIP} {managementSubnet}

.csv示例文件

ios_switch_info.csv

代码语言:javascript
复制
Temp IP,Building,Room,Device Role,Management IP,Management Subnet
192.168.1.1,Main,001,Access,10.1.1.2,255.255.255.0
192.168.1.2,Main,101,Access,10.1.1.3,255.255.255.0
192.168.1.3,Branch,007,Access,10.1.2.2,255.255.255.0

临时配置文件示例

Temp.cfg

代码语言:javascript
复制
hostname MainAcc001
spanning-tree mode rapid-pvst
udld enable
interface vlan 101
ip address 10.1.1.2 255.255.255.0

脚本示例

Base_IOS_Config.py

代码语言:javascript
复制
import os
import pandas as pd
from getpass import getpass
from napalm import get_network_driver

username = input("Username: ")
password = getpass()
driver = get_network_driver("ios")
df = pd.read_csv('ios_switch_info.csv')
for index, row in df.iterrows():

    # This section of variable assignment could get very long  
  
    tempIP = row['Temp IP']
    building = row['Building']
    room = row['Room']
    deviceRole= row['Device Role']
    managementIP = row['Management IP']
    managementSubnet= row['Management Subnet']
    hostname = row['Building'] + row['Device Role'][:3] + row['Room']
    managementVLAN = int(managementIP.split('.')[2]) + 100
    
    with open('Base_Config.cfg', 'r') as base_config:
        data = base_config.read()

    # This section of replacement could get very long depending on number of variables 

    data = data.replace('{hostname}', hostname)
    data = data.replace('{managementIP}', managementIP)
    data = data.replace('{managementSubnet}', managementSubnet)
    data = data.replace('{managementVLAN}', managementVLAN)

    with open('Temp.cfg', 'w') as temp_config:
        temp_config.write(data)

    with driver(tempIP,username,password) as device:
        print(f"Accessing {hostname}")
        device.load_merge_candidate(filename='Temp.cfg')
        ........other stuff..........
    device.close()
os.remove('Temp.cfg')
EN

回答 1

Stack Overflow用户

发布于 2020-08-27 13:28:39

我最后得出的结果是分配来自.csv (特定于交换机的变量)和导入ios_creds *(跨多个交换机的变量,例如NTP服务器地址)的变量,而不是手动分配它们:

代码语言:javascript
复制
device_info = row.to_dict() # creates dict of .csv variables {column:variable}
device_info.update(**globals) # adds all global variables to dict

为了将上述变量放入配置文件,而不是用data.replace逐行替换每个变量,我最后使用了以下内容:

代码语言:javascript
复制
for key, value in device_info.items():
    data = data.replace("{" + str(key) + "}", str(value))

这将解析配置文件,查找变量(例如{Hostname}),并将其替换为保存在字典中的相应变量(例如Hostname:MainAcc001)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63511261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档