2011-03-23 41 views
0

我在文件中使用seek - 文件中有一堆文件名和文件上的一些進程日誌 - 其中一些日誌有錯誤。我一行一行,如果我得到一個錯誤,我想記錄兩個文件名之間的所有內容。seek()在文件處理中的問題

當我使用seek時,我認爲不是將它移動到我想要的行,而是將它移動到字符#。例如

f=open("fileblah",'r') 
while f: 
    line=f.readline() 
    counter=counter+1 
    f.seek(tail_position) # i want the next loop to start from after the error happened. 

    if line.startswith("D:") 
     header_position=counter 
     error_flag=0 #unset error flag 
    if line.startswith("error") 
     error_flag=1  #set error_flag   
     while(not(line.startswith("D:"): #go until next file beginning 
      line=f.readline() 
      counter=counter+1 
     tail_position=counter #have come to the next filename 

我可以看到這是非常低效的,但它並沒有在所有的工作,因爲f.seek(tail_position)移動文件指針到字符#,而不是線#

回答

3

使用.tell()存儲您的開始位置,然後您可以將.seek()移回原始位置。

編輯:我想這是你想要什麼:

def errorsInLog(fname, newfileStr='D:', iserrorStr='error'): 
    with open(fname) as inf: 
     prev = pos = inf.tell() 
     line = inf.readline() 
     error = False 

     while line: 
      if line.startswith(newfileStr): 
       if error: 
        inf.seek(prev) 
        yield(inf.read(pos-prev)) 
       prev = pos 
       error = False 
      elif line.startswith(iserrorStr): 
       error = True 

      pos = inf.tell() 
      line = inf.readline() 

     if error: 
      inf.seek(prev) 
      yield(inf.read()) 

def main(): 
    print('\n\n'.join(errorsInLog('fileblah'))) 

對於每一個文件名,然後返回一個字符串包含文件名錯誤,所有後續行,直到但不包括下一個文件名或文件結束。

0

像stdio的fseek(),seek(offset [,whence])設置當前位置的偏移量。因此你可以這樣做:

while(not(line.startwith("D:"))): 
     fseek(tail_position,'\n') 
     tail_position ++ 
1

seek()用在隨機存取文件讀取中的次數更多。如果正在讀取的文件已經是文本,並且可以逐行讀取,那麼您只需要讀取該行,然後使用字符串操作在行上進行操作。沒有必要移動文件讀取位置。

你的代碼,只需要像這樣:

for line in f: 
    do_stuff_with line