2017-06-16 51 views
1

我有一個程序,告訴我誰今天會有他們的生日。
我的姓名和生日存儲在一個名爲data.txt的文本文件中。
這裏是data.txt中的一個樣本:使用迭代器和重新提取特定信息

Master 13/12 
Monkey 16/06 
Michael 16/06 
mike 01/05 
Minita 24/06 
Mom 12/06 

這裏是程序:

from __future__ import print_function 
import time 

logic = time.strftime("%d/%m") 
err_occur = []       
pattern = re.compile(logic, re.IGNORECASE) 
try: 
    with open ('data.txt', 'rt') as in_file:   
     for linenum, line in enumerate(in_file):   
      if pattern.search(line) != None:   
       err_occur.append((linenum, line.rstrip('\n'))) 
       for linenum, line in err_occur:    
        print("Line ", linenum, ": ", line, sep='') 
except IOError: 
    print ("data.txt Not found") 

如果我運行這個程序,如果今天的日期是16/06,它的輸出應該是

Line 3: Monkey 16/06 
Line 4: Michael 16/06 

但是它讓我看到的輸出只能

Line 3: Monkey 16/06 

我猜for...in聲明無效?
它們不應該在循環中工作嗎?

自從我學習python以來只有幾天。我還沒完全理解迭代器。因此,如果你能以外行人的方式解釋我的錯誤,這將非常有幫助。

EDIT-謝謝@zwer指出我的錯誤和@Coldspeed提供更高效的解決方案。

回答

1

有一種更簡單的方法來逐一獲取這些匹配行。您可以使用re.finditer。它返回匹配的發電機:

from __future__ import print_function 
import re 
import time 

s = open('data.txt', 'rt').read() 

logic = time.strftime("%d/%m") 
err_occur = []       
for m in re.finditer('(.*?)[\s]*' + logic, s, re.M | re.IGNORECASE): 
    print(m.group(0)) 

輸出

Monkey 16/06 
Michael 16/06 

這不會給你輸出的Line x。如果你想要的話,你可能需要改變一些東西。

+0

考慮,我將將所有的生日在'data.txt',我不認爲這種方法工作。因此,我建議你將你的第一行改爲's = open('data.txt','rt')。read()'EDIT-我剛剛看到你已經做了 –

+0

@HellfireCharchitPb完成。 –

1

爲什麼在閱讀文件時做雙循環?如果你想建立它自己的方式,只需打印出匹配的行:

from __future__ import print_function 
import re 
import time 

logic = time.strftime("%d/%m") 
err_occur = [] 
pattern = re.compile(logic, re.IGNORECASE) 
try: 
    with open ('data.txt', 'rt') as in_file: 
     for linenum, line in enumerate(in_file): 
      if pattern.search(line) != None: 
       line = line.rstrip("\n") 
       print("Line ", linenum + 1, ": ", line, sep='') 
       err_occur.append((linenum + 1, line)) 
except IOError: 
    print ("data.txt Not found") 

# Line 2: Monkey 16/06 
# Line 3: Michael 16/06