2013-04-22 135 views
1

我有一個Python腳本,具有嵌套for循環只有1環的Python:在嵌套excuted 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循環似乎僅執行一次。 潛在的問題是什麼?

+1

'DestHostList'只有一個元素? – Blender 2013-04-22 03:38:29

+0

很多元素,而不僅僅是一個 – misteryes 2013-04-22 03:39:53

+1

如果外層循環只循環一次,那麼該列表只有一個元素。內部循環遍歷'HostList'。 – Blender 2013-04-22 03:40:28

回答

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: 

此外,它是很好的做法,開Python中使用with語句的文件。

+0

你想用'open'打開文件,而不是'file'。 – Matthias 2013-04-22 07:43:41

+0

@Matthias我知道使用'open'是推薦的方法,但我不明白爲什麼OP應該擔心這樣一個細節,當他的真正擔心是使他的簡單腳本工作... – shx2 2013-04-22 17:04:59

+0

讓一些工作是好的。做一些工作,因爲它打算工作更好。 – Matthias 2013-04-22 20:37:27

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