2014-03-05 4 views
0

텍스트 파일을 열어서 한 번 작성한 텍스트 파일을 계속해서 쓰고이 파일을 새 줄을 콘솔에 인쇄합니다. 매번 전체 텍스트 파일. 파일 크기가 커지면 다음 줄 바꿈을 인쇄합니다. 이것은 대부분 효과적이지만 때로는 다음 줄 바꿈에 대해 약간 혼란스러워지며 새 줄은 몇 줄 위로 나타나며 이전 줄과 섞여 있습니다. 이 작업을 수행하는 더 좋은 방법은 현재 코드입니다. 이 위대한하지 않은, 표시 몇 초 걸립니다 텍스트 파일을 기다리는 동안텍스트 파일을 열고 파이썬에서만 새 줄을 인쇄하십시오.

또한
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

리눅스의'tail -f fname' 명령을 사용하고 싶을 수도 있습니다 - 윈도우에 있다면 cygwin을 사용하십시오. –

+0

관련 : [어떻게 파이썬에서 로그 파일을 꼬리 수 있습니까?] (http://stackoverflow.com/q/12523044/4279) – jfs

답변

0

은 아마 당신은 할 수 :

  • 당신이 그것을 읽을 필요가 때마다 직접 마지막으로 독서에 중지 된 위치에 seek에 인수로
  • 사용 lastSize 파일을 엽니 다.

추가 설명 : 보호가 필요한지 잘 모르겠지만 주어진 파일 이름이 파일인지 아닌지 테스트하지 않아도됩니다. try...except 블록에서 열어 문제가있는 경우 잡습니다.

응용 프로그램이 멈추는 경우, 예를 들어 메인 스레드는 하나의 스레드가 GUI를 처리하고 두 번째 스레드는 파일 생성을 기다리는 것과 같이 일종의 스레딩을 사용할 수 있습니다. 파일이 작성되면, 두 x 째 스레드는 표시 할 데이터를 포함하는 신호를 GUI 스레드로 송신합니다.

0

This 솔루션이 도움이 될 수 있습니다. os.path.isfiletime.sleep을 사용하여 파일이 나타날 때까지 약간 기다려야합니다.

관련 문제