2

我有一个带有嵌套for循环的 python 脚本

    HostList = file('trylist.txt')
    DestHostList = file('trylist2.txt')
    for DestHost in DestHostList:
            DestHost = DestHost.strip()
            for HostName in HostList:
                    HostName = HostName.strip()
                    try:
                            if DestHost!=HostName:
                                    print HostName,DestHost

                            print "one loop finishes"
                    except Exception, e:
                            ExceptionHost.write(HostName+' -  '+DestHost+':    '+str(e)+'\n')       
                            print "exception"
                            #traceback.print_exc(file=sys.stdout)

外部for循环似乎只执行一次。潜在的问题是什么?

4

2 回答 2

4

外循环执行不止一次,但只有在第一次迭代中它有事情要做。在其余部分,内部循环不执行,给您留下它只运行一次的印象。

问题是您打开第一个文件 ,trylist.txt并在外循环的第一次迭代中完全读取它。在第二次迭代中,文件对象(类似于迭代器)已被“使用”。

尝试:

HostList = file('trylist.txt').readlines()  # now it's a list of lines, not an iterator
DestHostList = file('trylist2.txt')
for DestHost in DestHostList:
    DestHost = DestHost.strip()
    for HostName in HostList:

如果文件很大并且您想避免将其存储在内存中,则可以每次都重新打开它:

DestHostList = file('trylist2.txt')
for DestHost in DestHostList:
    DestHost = DestHost.strip()
    HostList = file('trylist.txt')
    for HostName in HostList:

with此外,使用语句在 python 中打开文件是一种好习惯。

于 2013-04-22T04:33:26.627 回答
0

问题是您在第一次通过后已经用尽了内部循环中的第二个文件。

正如我所看到的,您正在尝试使用try ... except .... 但是由于文件读取操作在块之外,所以你错过了它。

这是一个提前阅读所有文件内容的解决方案。我希望它会有所帮助:

host_list = file("trylist.txt").readlines()
dest_host_list = file("trylist2.txt").readlines()

for h in host_list:
    for d in dest_host_list:
        h,d = h.strip(),d.strip()
        if h != d:
            print h,d
于 2013-04-22T04:46:40.040 回答