Python中的条件加法

0 投票
2 回答
1257 浏览
提问于 2025-04-16 22:59

我一直在用Python处理一个文本文件,想要根据条件来添加或扩展某些文本。如果这问题太基础,已经在这里讨论过,我先说声抱歉 :(

关于我附上的代码,我需要在包含“description”的那行下面添加“mtu 1546”,前提是它还不存在。另外,我还想在“interface”那行下面(如果有的话,也可以在“mtu”那行上面)添加“description TEST”,同样前提是它也不存在。我使用的是Python 2.7。

这是我的代码:

import re

f = open('/TESTFOLDER/TEST.txt','r')
interfaces=re.findall(r'(^interface Vlan[\d+].*\n.+?\n!)',f.read(),re.DOTALL|re.MULTILINE)

for i in interfaces:
    interfaceslist = i.split("!")
    for i in interfaceslist:
        if "mtu" not in i:
            print i


f.close()

打印语句在条件下工作得很好,能够正确打印出我感兴趣的行,但我的需求是将需要的语句添加到列表中,以便我可以进一步处理和解析。可是,当我尝试使用添加或扩展功能时,解释器却说这是一个字符串对象。以下是示例源文件(文本)。我将要解析的文本文件很大,所以只添加我感兴趣的文本。

!
interface Vlan2268
 description SNMA_Lovetch_mgmt
 mtu 1546
 no ip address
 xconnect 22.93.94.56 2268 encapsulation mpls
!
interface Vlan2269
 description SNMA_Targoviste_mgmt
 mtu 1546
 no ip address
 xconnect 22.93.94.90 2269 encapsulation mpls
!
interface Vlan2272
 mtu 1546
 no ip address
 xconnect 22.93.94.72 2272 encapsulation mpls
!
interface Vlan2282
 description SNMA_Ruse_mgmt
 no ip address
 xconnect 22.93.94.38 2282 encapsulation mpls
!
interface Vlan2284
 mtu 1546
 no ip address
 xconnect vfi SNMA_Razgrad_mgmt
!
interface Vlan2286
 description mgmt_SNMA_Rs
 no ip address
 xconnect 22.93.94.86 2286 encapsulation mpls
!
interface Vlan2292
 description SNMA_Vraca_mgmt
 mtu 1546
 no ip address
 xconnect 22.93.94.60 2292 encapsulation mpls
!

2 个回答

1

如果你能读取整个文件:

import re

f = open('/TESTFOLDER/TEST.txt','r')
text = f.read()

text = re.sub(r"(?m)(^interface Vlan\d+.*\n(?! description )", r"\1 description TEST\n", text)
text = re.sub(r"(?m)(^interface Vlan\d+.*\n description .+\n)(?! mtu )", r"\1 mtu 1546\n", text)
1

你问的问题其实很简单。字符串是不可改变的,这意味着你不能直接在它们后面添加内容或者扩展它们。你需要通过连接的方式来创建一个新的字符串。

>>> print i
interface Vlan2286
 description mgmt_SNMA_Rs
 no ip address
 xconnect 22.93.94.86 2286 encapsulation mpls

>>> print i + ' mtu 1546\n'
interface Vlan2286
 description mgmt_SNMA_Rs
 no ip address
 xconnect 22.93.94.86 2286 encapsulation mpls
 mtu 1546

然后你需要把这个结果保存到一个变量名或者某种容器里。你可以像这样把它保存到变量i里:

i = i + ' mtu 1546\n'

或者可以这样做:

i += ' mtu 1546\n'

不过在这种情况下,使用列表推导式可能会很有用……

def add_mtu(i):
    return i if "mtu" in i else i + " mtu 1546\n"

for iface in interfaces:
    interfaceslist = iface.split("!")
    updated_ifaces = [add_mtu(i) for i in interfaceslist]

注意,我把第一个i换成了iface,这样更清楚。而且,我发现目前在interfaces里似乎只有一个iface。也许你需要那个循环,但如果不需要,去掉它会让事情变得简单一些。

撰写回答