2011-11-18 55 views
6

我正在循環瀏覽一個文件,如果我找到了某些內容,想在將控制權返回給主循環之前預讀幾行代碼。但是,我想在我停止展望的時候返回控制權。如何在使用Python循環時讀取文件中的文件?

示例代碼:

for line in file: 
    line = line.strip() 
    llist = line.split() 

    if llist[0] == 'NUMS': 
     # some loop to read ahead and print nums on their own line 
     # until it finds END, then return control to the main for 
     # loop at the point where it stopped looking ahead. 

樣品輸入:

NUMS 
1 
2 
3 
4 
5 
END 
SOME 
MORE 
STUFF 
NUMS 
6 
7 
8 
9 
0 
END 

所需的輸出:

1 2 3 4 5 
6 7 8 9 0 

我是相當新的Python的,所以如果有一個更好的辦法做到除了使用循環展望外,我很高興看到它。

回答

4

當你循環打開文件時,你只能得到每一行一次。這與列表不同,列表中的每個for循環都會在整個列表中獲得自己的迭代器。

您可以從文件中的內部循環「偷」線路,使外環不會看到它們:

for line in file: 
    line = line.strip() 
    llist = line.split() 

    if llist and llist[0] == 'NUMS': 
     for line in file: 
      line = line.strip() 
      if line == 'END': 
       break 
      else: 
       print line, 
     print # newline 

閱讀上如何獲取更多信息iterators工作。

+0

因此,文件中的'for line:'開始在外部的一個斷開的線上?我原以爲它會從文件的開頭開始。 – astay13

+2

@astay:這與內部/外部無關。這段代碼中只有一個迭代器。 ''只是循環獲取下一個東西,直到迭代器引發StopIteration。你可以跳出循環並開始另一個循環,繼續獲得下一個循環。 –

+0

@John and Petr,感謝您幫助我更好地理解文件/迭代器!我選擇這個解決方案,因爲我的代碼需要大約500行預測。 – astay13

4

如果您不需要,這是不是一個好主意,這是這裏的情況。通過保持一個狀態位,你需要做的事情可以在一個for循環中完成。這個允許錯誤檢查擴展到更復雜的要求比可以通過同一迭代器上的嵌套循環處理。

guff = """NUMS 
1 
2 
etc etc 
9 
0 
END""" 

state = "" 
for item in guff.split(): 
    if item == "NUMS": 
     if state == "NUMS": print "missing END" 
     state = "NUMS" 
    elif item == "END": 
     if state == "": print "missing NUMS" 
     state = "" 
     print 
    elif state == "NUMS": 
     print item, 

if state == "NUMS": print # missing END