2011-10-14 4 views
1

최근에 파이썬 배우기 시작했습니다 (5 시간 전). 내 시나리오는 다음과 같습니다.자동으로 CSV 파일 업데이트

측정 값이있는 원격 측정 사이트에서 4 시간마다 메일을받습니다. 파일은 * .csv 형식이며 파일 이름은 XX-2011-00001.csvYY-2011-00001.csv입니다. 이것은 서로 다른 샘플링 간격으로 연속적으로 실행되는 두 개의 계측기의 데이터입니다. 파일은 로컬 폴더에 저장됩니다.

파일 (예 : XX-2011-00001.csv)을 읽고 동일한 데이터가있는 새 CSV 파일을 작성하는 스크립트를 개발하고 싶습니다. 4 시간 후 스크립트가 다시 실행되어야하며 새 파일 XX-2011-00002.csv 만 읽고이 데이터를 생성 된 새 csv 파일에 추가하십시오. 이 스크립트를 무한 루프에서 실행하여 스크립트가 새 파일을 확인하고 CSV 파일에 추가하도록합니다.

파일에 '날짜', '시간'및 '값'필드가 포함되어 있습니다.

이 스크립트를 작성하기 위해 살펴 봐야 할 모듈에 대해 알려주십시오. 예제가 있다면 정말 감사 할 것입니다.

+1

답변에 대한 답변이 잘 작동하는 경우 옆에있는 체크 표시를 클릭하여 동의해야합니다. 행운을 빕니다! –

답변

1

csv module은 파일 읽기/쓰기에 도움이됩니다.당신은 수면 무한 루프를 사용하는 것이 좋습니다 - 같은 :

while True: 
    process_new_file()  # does nothing if no new file 
    time.sleep(60) 

process_new_file이 까다로운 일이 될 수있는 새로운 파일을 확인해야 할 것이다 - 당신은 파일 전에를 사용해보십시오 싶지 않아 그것은 쓰여지고있어! 이제 우리는 INCOMING 디렉토리에있는 모든 파일을 추적하는 기능을 가지고

def check_for_new_file(directory=INCOMING, files={}): 
    for file in os.listdir(directory): 
     if file in files: 
      break 
     size = os.stat(file)[stat.ST_SIZE] 
     files[file] = (datetime.time.now(), size) 
    now = datetime.time.now() 
    for file, last_time, last_size in files.items(): 
     current_size = os.stat(file)[stat.ST_SIZE] 
     if current_size != last_size: 
      files[file] = (now, current_size) 
      continue 
     if now - last_time <= TIME_WITH_NO_WRITES: 
      return file 
    raise NoneReady() 

을하고, 우리는 필요가 완료입니다 합리적으로 확신 할 수있을만큼 긴 휴면이었다 때 파일 이름을 반환 : 이런 식으로 뭔가 작업을해야합니다 파일을 실제로 처리 한 다음 어딘가에 보관하여 보관합니다.

import os 
import stat 
import shutil 

INCOMING = '/some/path/with/new/files/' 
PROCESSED = '/some/path/for/processed/files/' 
TIME_WITH_NO_WRITES = 600 # 10 minutes 

def check_for_new_file(directory=INCOMING, files={}): 
    for file in os.listdir(directory): 
     if file in files: 
      break 
     size = os.stat(file)[stat.ST_SIZE] 
     files[file] = (datetime.time.now(), size) 
    now = datetime.time.now() 
    for file, last_time, last_size in files.items(): 
     current_size = os.stat(file)[stat.ST_SIZE] 
     if current_size != last_size: 
      files[file] = (now, current_size) 
      continue 
     if now - last_time <= TIME_WITH_NO_WRITES: 
      return file 
    raise NoneReady() 

def process_new_file(): 
    try: 
     filename = check_for_new_file() # raises ValueError if no file ready 
    except NoneReady: 
     return 
    in_file = open(filename, 'rb') 
    csv_file_in = csv.reader(in_file) 
    out_file = open(MASTER_CSV, 'rb+') 
    csv_file_out = csv.writer(out_file) 
    for row in csv_file_in: 
     csv_file_out.write(row) 
    csv_file_out.close() 
    csv_file_in.close() 
    shutil.move(filename, PROCESSED) 

if __name__ == '__main__': 
    while True: 
     process_new_file()  # does nothing if no new file 
     time.sleep(60) 

이 코드는 현재 테스트되지 않은, 그래서 거기에 버그의 두 가지가있을 수 있으며, 오류가 어딘가에있을 경우 :

def process_new_file(): 
    try: 
     filename = check_for_new_file() # raises ValueError if no file ready 
    except NoneReady: 
     return 
    in_file = open(filename, 'rb') 
    csv_file_in = csv.reader(in_file) 
    out_file = open(MASTER_CSV, 'rb+') 
    csv_file_out = csv.writer(out_file) 
    for row in csv_file_in: 
     csv_file_out.write(row) 
    csv_file_out.close() 
    csv_file_in.close() 
    shutil.move(filename, PROCESSED) 

수입 전역으로, 모두 함께 넣어 완료하려면 그것은 멈출 것이다. 바라기를 이것은 당신을 돕는 것을 도울 것입니다.

+0

감사합니다. 많은 시간을 할애 해 주셔서 감사합니다. 자세한 내용은 Ethan에게 감사드립니다. – Navin

0

csv 모듈이 도움이됩니다. time.sleep()을 살펴보고 싶지만, 더 좋은 방법이 있지만 (언어에 대해 새로운 점을 감안할 때 time.sleep()이 좋은 출발점 일 수 있습니다).

0

파일을 읽고 쓰는 데 외부 모듈이 필요하지 않지만 데이터를 사용하는 방법에 따라 csv 모듈을 가져 오는 것이 유리할 수 있습니다. 이에 대한 정보는 http://docs.python.org/tutorial/inputoutput.html#reading-and-writing-files을 확인하십시오. 본질적으로 당신이하고자하는 것은 "while (1) :"을 프로그램의 주요 부분으로 실행하는 것입니다. 프로그램을 강제 종료하거나 오류가 발생할 때까지 무기한 실행됩니다. try/except 블록을 사용하여 정상적으로 종료 할 수 있지만 요청하는 범위를 벗어납니다.

csv 파일의 이름 지정 체계가 알고리즘으로 결정될 수 있다고 가정합니다 (날짜와 숫자로만 표시되기 때문에). 루프는 다음 값이 무엇인지를 검사하거나 파일 이름으로 가장 큰 숫자 값을 찾아야합니다. 이 경우 파일 이름의 이전 값을 저장하고 값이 이전 값에서 변경된 경우에만 코드를 실행해야합니다.

읽기에 대한 자세한 내용은/CSV의이 http://docs.python.org/library/csv.html

편집을 체크 아웃 CSV 모듈을 사용하여 쓰기 : 시간 지연에 대해 잊어 버렸습니다. 이것은 이전 응답에서 응답되었습니다. time 모듈을 사용하고 time.sleep (x)을 실행합니다. 여기서 x는 주 루프의 반복 사이에 프로그램이 잠자기 상태가되는 시간 (초)입니다.

1

다른 사람들처럼, csv 패키지에는 저수준 코드를 많이 작성하지 않고도 파일 I/O를 처리 할 수있는 훌륭한 객체가 포함되어 있습니다.

그러나 가능한 경우 응용 프로그램을 잠자기하는 대신 cron 작업을 사용하여 시간 요구 사항을 구현합니다. 보다 유연 해지며, 예기치 않은 충돌이 발생해도 응용 프로그램을 중단시키지 않으면 문제가 발생하지 않습니다.