首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在从csv文件导入python时替换数字

如何在从csv文件导入python时替换数字
EN

Stack Overflow用户
提问于 2021-12-01 14:41:53
回答 1查看 95关注 0票数 0

我目前正在编写一个Python脚本,以便从csv文件中提取数据,以利用Jinja2模板生成cisco ASR配置。所有这些都运行得很好;但是,我需要修改一行,以便生成的输出使用正确的ASR配置语法。我有数百个这样做,并希望能够简单地生成一个简单的复制和粘贴到设备的ASR配置正确。有人能指导我做这件事的最简单的方法吗?

我的Python脚本:

代码语言:javascript
复制
import os
import jinja2
import csv
import re

# csv fileused
csv_file = "BFL1_AR1.csv"
with open(csv_file) as f:
    read_csv = csv.DictReader(f)
    for list_elements in read_csv:
        generated_list = list_elements['TEST']
        generated_list = generated_list.split()
        list_elements['TEST'] = generated_list
        pattern = re.findall('4323:(\d{1,9})\:\DD', )
        print (pattern)

        template_file = 'asr_generate_config.j2'
        with open(template_file) as f:
            list_template = f.read()

        template = jinja2.Template(list_template)
        print()
        print('-' * 80)
        print(template.render(list_elements))
        print('-' * 80)
        print()

生成的输出:

代码语言:javascript
复制
--------------------------------------------------------------------------------
l2vpn bridge group 4323:63210:BD
l2vpn bridge group 4323:63210:BD bridge-domain 4323:63210:BD
l2vpn bridge group 4323:63210:BD bridge-domain 4323:63210:BD mac withdraw state-down
l2vpn bridge group 4323:63210:BD bridge-domain 4323:63210:BD mtu 9216
l2vpn bridge group 4323:63210:BD bridge-domain 4323:63210:BD interface be10.149
l2vpn bridge group 4323:63210:BD bridge-domain 4323:63210:BD interface be50.149
l2vpn bridge group 4323:63210:BD bridge-domain 4323:63210:BD vfi 4323:63210:BD
l2vpn bridge group 4323:63210:BD bridge-domain 4323:63210:BD vfi 4323:63210:BD vpn-id 1024571
l2vpn bridge group 4323:63210:BD bridge-domain 4323:63210:BD vfi 4323:63210:BD autodiscovery bgp
l2vpn bridge group 4323:63210:BD bridge-domain 4323:63210:BD vfi 4323:63210:BD autodiscovery bgp rd auto
l2vpn bridge group 4323:63210:BD bridge-domain 4323:63210:BD vfi 4323:63210:BD autodiscovery bgp route-target 4323:63210
interface be10.149 l2transport
interface be10.149 l2transport description CA/KXFN/201755/LVLC
interface be10.149 l2transport encapsulation dot1q 149
interface be10.149 l2transport rewrite ingress tag pop 1 symmetric
interface be10.149 l2transport ethernet-services access-group L2-FRAMES ingress
interface be50.149 l2transport
interface be50.149 l2transport description CA/KXFN/201755/LVLC
interface be50.149 l2transport encapsulation dot1q 149
interface be50.149 l2transport rewrite ingress tag pop 1 symmetric
interface be50.149 l2transport ethernet-services access-group L2-FRAMES ingress
--------------------------------------------------------------------------------

我需要改变的是:

具有以下数据格式的每个实例: 4323:63210:BD --> 4323_63210

每个客户的网桥组ID将保持不变。我需要将第一个分号改为下划线,并删除最后一个分号和B&D字母。我一直在尝试使用regex & re.findall来做这件事,但是一直没有太多的运气。

CSV文件:

代码语言:javascript
复制
AR Unit ID  AR_VLAN TEST    CIRCUIT oline lookup    uni lookup  oline dummy service reference   oline svlan assignment  oline_BD_assignment oline_RT_assignment oline_vpnid_assignment  end point node  ring id Add BFL1-AR1/ 6K Topology   New Router Port New_US_6K_Port  Add 6K / 7609 Topology  New_DS_6K_Port  New 6K Port
4   4   MATCH   66/KDFN/102901/TWCS 66/KDFN/102901/TWCS_O_Line  66/KDFN/102901/TWCS DUMMY_OLINE_SVC173  4   4323:63163:BD   4323:63163  1024524 BKFECAAAI6001   #N/A    00GZPP/GE1L/BKFECAAA/BKFECAAA   ae10.4  be10.4  00GZQB/GE1L/BKFECAAA/BKFECAAA   be50.4  Po50.4
15  15  MATCH   66/KEFN/102374/TWCS 66/KEFN/102374/TWCS_O_Line  66/KEFN/102374/TWCS DUMMY_OLINE_SVC176  15  4323:63166:BD   4323:63166  1024527 BKFECAUZW2001   N66200  00GZPP/GE1L/BKFECAAA/BKFECAAA   ae10.15 be10.15 00GZQB/GE1L/BKFECAAA/BKFECAAA   be50.15 Po50.15
39  39  MATCH   66/KEFN/102539/TWCS 66/KEFN/102539/TWCS_O_Line  66/KEFN/102539/TWCS DUMMY_OLINE_SVC177  39  4323:63167:BD   4323:63167  1024528 BKFDCA12NN001   N66204  00GZPP/GE1L/BKFECAAA/BKFECAAA   ae10.39 be10.39 00GZQB/GE1L/BKFECAAA/BKFECAAA   be50.39 Po50.39
50  50  MATCH   66/KFFN/102600/TWCS 66/KFFN/102600/TWCS_O_Line  66/KFFN/102600/TWCS DUMMY_OLINE_SVC203  50  4323:63193:BD   4323:63193  1024554 SHFTCADIW2001   N66198  00GZPP/GE1L/BKFECAAA/BKFECAAA   ae10.50 be10.50 00GZQB/GE1L/BKFECAAA/BKFECAAA   be50.50 Po50.50

Jinja2模板

代码语言:javascript
复制
l2vpn bridge group {{ oline_BD_assignment }}
l2vpn bridge group {{ oline_BD_assignment }} bridge-domain {{ oline_BD_assignment }}
l2vpn bridge group {{ oline_BD_assignment }} bridge-domain {{ oline_BD_assignment }} mac withdraw state-down
l2vpn bridge group {{ oline_BD_assignment }} bridge-domain {{ oline_BD_assignment }} mtu 9216
l2vpn bridge group {{ oline_BD_assignment }} bridge-domain {{ oline_BD_assignment }} interface {{ New_US_6K_Port }}
l2vpn bridge group {{ oline_BD_assignment }} bridge-domain {{ oline_BD_assignment }} interface {{ New_DS_6K_Port }}
l2vpn bridge group {{ oline_BD_assignment }} bridge-domain {{ oline_BD_assignment }} vfi {{ oline_BD_assignment }}
l2vpn bridge group {{ oline_BD_assignment }} bridge-domain {{ oline_BD_assignment }} vfi {{ oline_BD_assignment }} vpn-id {{ oline_vpnid_assignment }}
l2vpn bridge group {{ oline_BD_assignment }} bridge-domain {{ oline_BD_assignment }} vfi {{ oline_BD_assignment }} autodiscovery bgp
l2vpn bridge group {{ oline_BD_assignment }} bridge-domain {{ oline_BD_assignment }} vfi {{ oline_BD_assignment }} autodiscovery bgp rd auto
l2vpn bridge group {{ oline_BD_assignment }} bridge-domain {{ oline_BD_assignment }} vfi {{ oline_BD_assignment }} autodiscovery bgp route-target {{ oline_RT_assignment }}
interface {{ New_US_6K_Port }} l2transport
interface {{ New_US_6K_Port }} l2transport description {{CIRCUIT}}
interface {{ New_US_6K_Port }} l2transport encapsulation dot1q {{ AR_VLAN }}
interface {{ New_US_6K_Port }} l2transport rewrite ingress tag pop 1 symmetric
interface {{ New_US_6K_Port }} l2transport ethernet-services access-group L2-FRAMES ingress
interface {{ New_DS_6K_Port }} l2transport
interface {{ New_DS_6K_Port }} l2transport description {{CIRCUIT}}
interface {{ New_DS_6K_Port }} l2transport encapsulation dot1q {{ AR_VLAN }}
interface {{ New_DS_6K_Port }} l2transport rewrite ingress tag pop 1 symmetric
interface {{ New_DS_6K_Port }} l2transport ethernet-services access-group L2-FRAMES ingress
EN

回答 1

Stack Overflow用户

发布于 2021-12-01 14:55:12

如果您的ID将始终采用通用格式:

代码语言:javascript
复制
pattern = r'(?P<name>[0-9]{4}:[0-9]{5})'
re.findall(pattern, test_value)
# Will return a list of matches, which you can then substitute the : for a _

或者,如果您想要更具体,以确保您也匹配:BD后缀:

代码语言:javascript
复制
pattern = r'(?P<name>[0-9]{4}:[0-9]{5}):[A-Z]{2}'

在获取更多详细信息后添加一些编辑:

代码语言:javascript
复制
def convert(old_id):
    pattern = r'(?P<name>[0-9]{4}:[0-9]{5})'
    matches = re.match(pattern, old_id)
    if matches:
        match=matches[0]
    else:
        return 'some_default'
    return match.replace(':','_')

或者不使用正则表达式:

代码语言:javascript
复制
def convert_simple(old_id):
    return '_'.join(old_id.split(':')[:2])

但是,这不会对ID的表单进行验证,因此,如果您确信csv中的ID都是正确的,那么就使用它。

您可以使用该方法将ID为:格式的表单转换为_格式的表单

然后,在您的代码中,我将使用以下命令获取旧ID

代码语言:javascript
复制
old_id = list_elements['oline_BD_assignment']
new_id = convert(old_id)
list_elements['oline_BD_assignment'] = new_id
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70186210

复制
相关文章

相似问题

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