2014-12-24 3 views
1

저는 작업 스케줄러를 사용하여 매 5 분마다 실행되도록 Python 스크립트를 작성하고 지속적으로 증가하는 로그 파일 (텍스트 파일)을 읽고 DB에 데이터를 삽입합니다. 새 로그 파일이 매일 생성됩니다.Python이 지속적으로 증가하는 파일을 읽으려고합니다

포인터를 수정하고 마지막 줄 끝 부분에 포인터를 놓아야하므로 스케줄러가 다시 실행될 때 마지막으로 삽입 된 줄 다음에 시작됩니다. 새 날이 시작되면 포인터는 새 파일의 첫 번째 줄로 돌아갑니다. Seek 함수가이를 수행 할 수는 있지만 아직 방법을 파악할 수 없습니다. 대신 반복적으로 프로그램을 실행하고 중단 한 부분, 당신은 단순히 한 번 프로그램을 실행하고 새로운 콘텐츠에 대한 파일을 모니터링 할 수 있습니다 기억의

import time, os 
day=time.strftime("%Y%m%d") 
month=time.strftime("%m") 
filename=time.strftime("%Y%m%d") 

# Check for a new day 
currTime = datetime.datetime.now() 
lastDay = 0 


#Open file in a relative location 
logs_dir = os.path.dirname(r'C:\Python27\Logs\\') 
rel_path = os.path.join('\\', month, filename + '.log') 
abs_file_path = os.path.join(logs_dir, month, filename) + '.log' 
file = open(abs_file_path, 'r') 


if currTime.day != lastDay: 
    lastDay = currTime.day 
    file.seek(first_byte_to_read) #<<-- to reset the pointer ?? 
else: 
    file.seek(last_read_byte) 
+2

쉽게 : 다른 곳에서 파일의 현재 길이를 기억하고 다음 번에 다시 시작할 수 있습니다. 로그에 삽입하는 것은 지저분합니다. – Amadan

+1

예제에는 로그 파일 처리 또는 여러 번 실행되는 동안 파일 오프셋을 저장하고 검색하는 메커니즘이 표시되지 않습니다. 그러나 일반적인 생각은 파일을 처리하고'file.tell()'을 호출하여 현재 파일 위치를 얻는 것입니다. 그 파일을 어딘가에 저장하면,'file.seek (the_saved_position, 0)'파일을 열어서 계속 진행할 수 있습니다. – tdelaney

+1

파일'file.seek (0, 2)'의 끝을 탐색하고'file.tell()> the_saved_position'을 검사함으로써 처리가 필요한지 알 수 있습니다. – tdelaney

답변

2

: 여기 내 시도이다. 이를 수행하는 주요 방법은 두 가지가 있습니다.

  1. 폴링. 파일 끝까지 읽은 다음 몇 초 후에 다시 시도하십시오. 간단하고 안정적이지만 전원이 제약 된 장치에 대해서는 좋은 아이디어가 아닙니다.
  2. 비동기. Linux에서 PyInotify을 사용하면 파일에서 새 내용을 사용할 수있을 때 깨어납니다. Windows 사용자 인 것처럼 보입니다. 여기를 참조하십시오 : How do I watch a file for changes? 좀 더 복잡하지만 일반적으로 더 나은 솔루션입니다.
관련 문제