我有一个python脚本,带有嵌套的for
循环
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
循环似乎只执行一次。
可能是什么潜在的问题?
答案 0 :(得分:3)
外部循环执行多次,但只有在第一次迭代中它才能执行。在其余部分中,内部循环不会执行,只留下它只运行一次的印象。
问题是您打开第一个文件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中打开文件。
答案 1 :(得分: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