2010-07-14 4 views
2

파일에 1000 줄을 쓰고 그 파일에 대해 정규 표현식을 계속하는 스크립트가 있지만 쓰여진 텍스트의 마지막 100 줄만 사용할 수 있습니다. 이를 해결하는 한 가지 방법은 파일을 닫고 다시 여는 것입니다. 기록 된 파일을 다시로드 할 수있는 방법이 있습니까? 아니면 그냥 닫기 모듈을 닫아야합니까? 로그 파일이 존재하지 않거나 첫 번째 열 때 비어있는 것이 적절할 수 있습니다.파이썬에서 파일을 다시로드하는 방법은 무엇입니까?

>>> the_page = 'some large site opened through urllib' 
>>> logfile = open('./artist/' + tags['ARTIST'], 'r+') 
>>> logfile.write(the_page) 
>>> print logfile.read() 

아무것도 표시되지 않습니다.

>>> 'Some regular expressions search' 

마지막 100 줄에 대한 검색입니다.

>>> logfile.close() 
>>> logfile = open('./artist/' + tags['ARTIST'], 'r+') 
>>> print logfile.read() 

모든 것이 나타납니다.

>>> 'Some regular expressions search' 

예상대로 수행됩니다.

답변

5

이것은 단지 직감이지만, 작성이 끝나면 logfile.seek(0) 일 수 있습니다. 가능한 설명은 file.next의 설명서에 나와있다 : 그러나

를 절대 위치가 미리 읽기 버퍼를 플러시한다 에 파일을 재배치 seek()을 사용.

0
logfile.flush() 

파일 열기와 동일한 작업을 수행해야합니다.

+0

그래, 나는 이것에 반대하고 싶다. 플러싱은 내 문제가 해결 될 때까지 닫을 수 있습니다. – dmikalova

+0

@teratomata, 파일을 플러시하지 않으려는 이유를 분명히 할 수 있습니까? –

+0

플러시는 파일 객체를 지우고, 내가하고 싶은 것은 기록 된 파일을 다시로드하는 것입니다. 사실 내가 원하지 않는 것은 파일 (0)을 찾는 파일의 처음으로 돌아가는 것입니다. – dmikalova

-1

의견에서 지적했듯이이 문제를 해결하는 것은 잘못된 방법입니다. seek (0)은 올바른 방법입니다.

이것은 꽤 명백한 대답이었습니다. 파일을 닫을 필요가 없습니다. 다시 열어서 다시로드 할 수 있습니다. 따라서 :

>>> the_page = 'some large site opened through urllib' 
>>> logfile = open('./artist/' + tags['ARTIST'], 'r+') 
>>> logfile.write(the_page) 
>>> logfile = open('./artist/' + tags['ARTIST'], 'r+') 
>>> print logfile.read() 
+0

아마도 파일을 닫은 다음 다시 열었을 것입니다. Space_C0wb0y가 쓴 것처럼, 쓰기가 끝나면 파일의 끝에 위치하므로 아무 것도 읽을 수 없으므로 아마도 (0)을 찾아야합니다. – zvone

+0

cpython의 refcounting을 사용하면 파일을 다시 열 때 파일의 숨겨진'flush' 및'close'를 수행하는 것입니다. 이것은 garbarge 컬렉션의 다른 유형을 사용하는 Python의 구현에 대해 제대로 작동하지 않습니다. –

+0

맞습니다. 왜 내가 이것을 깨닫지 못했는지 모르겠습니다. – dmikalova

관련 문제