Python中的条件加法
我一直在用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。也许你需要那个循环,但如果不需要,去掉它会让事情变得简单一些。