2016-06-14 2 views
0

나는 소유 한 각 과일의 수를 기록한 파일을 가지고 있습니다. 그런 다음 최신 상태로 유지하려면 매분마다 편집해야합니다.끊임없이 파일 업데이트

apples: 3 
bananas: 6 
oranges: 12 
total: 21 fruits 

이 파일을 편집하려면 python을 사용하고 싶습니다. 그러나 몇 가지 문제가 발생했습니다 :

1) 현재 읽기/쓰기를 사용하고 있습니다.

with open(file, 'r') as infile: 
    # read fruits that I have 
infile.close() 
with open(file, 'w') as outfile: 
    while True: 
     # update data and write to file 
outfile.close() 

(메모리 매핑없이) 더 좋고/더 효율적인 방법이 있습니까? 나는 f.seek (offset, from_what)를 사용하여 시도했지만, 사과 자체가 문제가된다. (사과가 1 자리에서 2 자리로 이동하면 파일의 나머지 부분을 버린다.)

2) 어떻게 변화하고 있는지 어떻게 알 수 있습니까? 나는 "tail -f"를 시도했지만, 현재 파일 전체를 편집하는 방식으로 전체 전체 파일을 추가 할 것입니다.

3) 필자는 while 모양을 입력 할 때 파일을 계속 편집하고 있으므로 고양이 또는 vim 파일을 시도 할 때 불완전합니다. 이상적으로 파일을 열면 파일이 완전히 보이고 업데이트 된 것을 볼 수 있습니다.

읽어 주셔서 감사합니다.

+0

somefile.close()를 사용할 필요가 없습니다. for 문은 일단 범위를 벗어나면이를 수행합니다. 루프를 열기 전에 매번 파일을 열어야합니다 (coutless systemcall이 발생하여 속도가 느려집니다). 어떤 종류의 데이터를 문자열이나 원시 바이트로 작업하고 있습니까? 나머지 코드를 게시 할 수 있습니까? – wind85

+0

@ wind85 나는 Strings와 함께 일하고있다. – ZtoYi

+1

'wb'는 데이터를 바이트로 취급하고 'b'는 바이너리 모드를 나타냅니다. – wind85

답변

0

가장 좋은 방법은 파일을 읽고 변수 수를 파싱하는 것입니다. 그런 다음 수학을 수행하고 사과 3 개를 추가 한 다음 파일을 다시 작성하십시오.

키가 과일 이름이고 값이 과일 수 인 사전을 사용하면 가장 잘 할 수 있습니다. 파일을 처리하고 사전을 채우고 사전을 수학으로 업데이트 한 다음 사전을 원하는 형식으로 파일에 쓰는 함수를 작성하는 함수를 작성하기 만하면됩니다. 이것은 비교적 간단해야합니다.

+0

이것은 내가 한 일입니다. 그러나 게시물에 나열된 문제가 발생했습니다. – ZtoYi

+0

나는 당신이 가진 이슈를 이해하고 있는지 확신 할 수 없다. 1. seek을 사용하지 말고 readlines() 및 구문 분석을 사용하십시오. 모든 독해와 파싱을 한 다음 전체 파일을 작성하십시오. 한 번에 하나씩 각 값을 편집하려고하는 것과는 대조적입니다. 2-3. 파일을 전체 시간 동안 열어 두지 마십시오. 매분마다 파일을 업데이트하면되므로 매 분마다 파일을 열어 편집하면됩니다. – bravosierra99

1

'w +'또는 'r +'모드를 사용하여 읽고 쓸 수 있습니다. 텍스트 모드에서 파일을 열면 기본적으로 완전히 버퍼링됩니다. 라이브 업데이트를 보려면 각 쓰기를 flush해야하며 파일을 회선 버퍼 모드 (buffering=1)로 열어야합니다.
또한 파일이 추가되지 않기 때문에 tail -f을 사용할 수 없습니다. 실시간 업데이트를 시청하려면 cat 번을 반복해서 호출해야하므로 watch cat fruits.txt 할 것입니다.

여기에서 시나리오를 시뮬레이션했습니다.

from time import sleep 

fruits = dict(apple=1, banana=2, orange=3) 
with open('fruits.txt', 'w+', buffering=1) as f: 
    for _ in range(20): 
     for fruit, count in fruits.items(): 
      f.write('{}: {}\n'.format(fruit, count)) 

     f.seek(0) 
     for line in f: 
      line = line.strip().split(':') 
      line[1] = int(line[1]) + 1 
      fruits.update((line,)) 
     f.seek(0) 
     sleep(1) 
관련 문제