Python:循环没有中断

Python: loop doesn't break

中断循环时遇到问题。当它到达结束词时,我想打破它。希望您能帮助我了解这段代码中缺少的内容。谢谢。

def y():
    with open('test.conf', 'r') as rf:
        x = list()
        for line in rf:
            if 'config system global' in line:
                x.append('config system global\n')
                while True:
                    x.append(rf.__next__())
                    if 'end\n' in line:
                        break

                    with open('test.txt', 'w') as wf:
                        wf.writelines(x)


config system global
    set admin-maintainer disable
    set admin-scp enable
    set admin-server-cert "Fortinet_Firmware"
    set admintimeout 15
    set anti-replay disable
    set fgd-alert-subscription advisory latest-threat
    set gui-dynamic-routing enable
    set gui-multiple-utm-profiles enable
    set gui-replacement-message-groups enable
    set gui-sslvpn-personal-bookmarks enable
    set gui-sslvpn-realms enable
    set gui-wireless-opensecurity enable
    set hostname "XXXXXX"
    set internal-switch-mode interface
    set revision-backup-on-logout enable
    set revision-image-auto-backup enable
    set strong-crypto enable
    set tcp-timewait-timer 120
    set timezone 80
    set vdom-admin enable
end
config system accprofile
    edit "prof_admin"
        set admingrp read-write
        set authgrp read-write
        set endpoint-control-grp read-write
        set fwgrp read-write
        set loggrp read-write
        set mntgrp read-write
        set netgrp read-write
        set routegrp read-write
        set sysgrp read-write
        set updategrp read-write
        set utmgrp read-write
        set vpngrp read-write
        set wanoptgrp read-write
        set wifi read-write

尝试使用 re module.

例如:

import re        
for line in s.split("\n"):
    if re.match('end', line):
        break

问题是内部 while 循环:

while True:
    x.append(rf.__next__())
    if 'end\n' in line:
        break

这是一个无限循环,因为line在循环中不会改变。它可能以 StopIteration 异常结束,除非它被捕获

正确的代码是:

while True:
    line = rf.__next__()
    if 'end\n' in line:
        break
    x.append(line)

end 的测试之前或之后追加,具体取决于您是否要将 end 保留在块中。

并取消缩进:

with open('test.txt', 'w') as wf:
    wf.writelines(x)

与另一个 with 块处于同一级别,否则文件将在每次迭代时写入。