2014-03-05 135 views
0

我打開一個文本文件,該文件一旦被創建,就會不斷被寫入,然後將其打印到任何新行的控制檯中,因爲我不想重新打印整個文本文件每次。我正在檢查文件是否增大,如果是,則打印下一行。這主要是可行的,但偶爾它會對下一個新行感到困惑,新行出現幾行,與舊行混在一起。 有沒有更好的方法來做到這一點,下面是我目前的代碼。要創建打開文本文件,僅在python中打印新行

infile = "Null" 
while not os.path.exists(self.logPath): 
    time.sleep(.1) 

if os.path.isfile(self.logPath): 
    infile = codecs.open(self.logPath, encoding='utf8') 
else: 
    raise ValueError("%s isn't a file!" % file_path) 

lastSize = 0 
lastLineIndex = 0 
while True: 
    wx.Yield() 
    fileSize = os.path.getsize(self.logPath) 
    if fileSize > lastSize: 
     lines = infile.readlines() 
     newLines = 0 
     for line in lines[lastLineIndex:]: 
      newLines += 1 
      self.running_log.WriteText(line) 

     lastLineIndex += newLines 

     if "DBG-X: Returning 1" in line: 
      self.subject = "FAILED! - " 
      self.sendEmail(self) 
      break 
     if "DBG-X: Returning 0" in line: 
      self.subject = "PASSED! - " 
      self.sendEmail(self) 
      break 
    fileSize1 = fileSize 
    infile.flush() 
    infile.seek(0) 

infile.close() 

而且我的應用程序凍結而等待文本文件,因爲它需要幾秒鐘出現,這也不是很大。

乾杯。

+1

您可能只想使用linux'tail -f fname'命令 - 如果您在Windows上使用cygwin。 –

+0

相關:[我怎樣才能在Python中記錄日誌文件?](http://stackoverflow.com/q/12523044/4279) – jfs

回答

0

也許你可以:

  • 打開該文件每次需要它來讀取時間,
  • 使用lastSize作爲參數傳遞給seek直接給你停在上次閱讀的位置。

其他評論:我不知道你是否需要一些保護,但我認爲你不應該打擾測試給定的文件名是否是文件;只需在try...except區塊中打開並發現問題即可。

至於凍結你的應用程序,你可能想要使用某種線程,例如:一個線程,你的主線程正在處理GUI,第二個線程將等待創建文件。一旦文件被創建,第二個線程就會向GUI線程發送信號,其中包含要顯示的數據。

0

This解決方案可以提供幫助。您還需要等待,直到文件出現,使用os.path.isfiletime.sleep