2016-09-28 16 views
1

我對枚舉函數中的start參數有輕微的困惑,因爲我最近開始使用python,我不知道它應該如何工作。 假設我有下面的示例文件:在枚舉Python中指定開始參數時返回的行號不正確

Test 1 
Test 2 
Test 3 

這是第一線[SB WOM]|[INTERNAL REQUEST]|[START]這是消息

Name : Vaibhav 
Designation : Technical Lead 
ID : 123456 
Company : Nokia 

的開始這是第六行[SB WOM]|[INTERNAL REQUEST]|[END]其消息的末尾

現在,當我運行下面的代碼:

path =("C:/Users/vgupt021/Desktop") 
in_file = os.path.join(path,"KSClogs_Test.txt") 
fd = open(in_file,'r') 
for linenum,line in enumerate(fd) : 
    if "[SB WOM]|[INTERNAL REQUEST]|[START]" in line: 
     x1 = linenum 
     print x1 
     break 
for linenum,line in enumerate(fd,x1): 
    if "[SB WOM]|[INTERNAL REQUEST]|[END]" in line: 
     print linenum 
     break 

我得到的亞麻籽返回爲3和7,我不清楚它爲什麼不返回爲3,8。因爲"[SB WOM]|[INTERNAL REQUEST]|[END]"行的索引號是8而不是7,所以起始參數如何在第二部分循環。

回答

0

由於文件迭代器對象已經讀取了前四行,因此在運行第二個for循環時,它會從停止的位置開始。先前迭代停止在第3行(假設我們從0開始計數),在下一個for循環開始於第4行

因此,第二回路的enumerate應從x1 + 1開始不x1與指數x1是線已經在前面的循環中涵蓋;第一循環的最後一行:

for linenum, line in enumerate(fd, x1+1): 
    ... 
+0

非常感謝摩西的快速回復。您還可以幫助我解決上述情況,假設它是一個非常大的文件,它具有上述提到的行,如果我將輸入作爲「ID = 123456」輸入,我應該打印所有從「開始」到「結束」的行。 –

+0

我認爲如果您將此作爲新問題發佈,則會更好。 –

0

試試這個代碼

x = range(10) 
for i, e in enumerate(x): 
    if i == 4: 
     print i 
     st = i 
     break 

for i, e in enumerate(x, st): 
    print i 

你會看到這樣的輸出:

4 
4 5 6 7 8 9 10 11 12 13 

那麼,是什麼的enumerate第二個參數?那麼,這是enumerate索引的起始值。可迭代變量x從頭開始再次被枚舉,但在不同迭代中的值爲i,其值爲st

而是具有i數值爲0,1,2,等等,我們有4個,5個,6個等

我認爲這解釋了爲什麼你在你的代碼不正確的行號。

+0

非常感謝這麼精彩的解釋,絕對讓我明白了代碼的工作原理。可以幫助我解決上述情況,假設它是一個非常大的文件,它在文件的某處有上面提到的行如果我把輸入作爲「ID = 123456」,我應該把所有從「開始」到「結束」的行打印出來。 –