2010-03-15 2 views

답변

27

예. 그것은 당신을위한 기본 close() 함수를 사용합니다 (source).

+2

(다른 말로하면, 버퍼링 된 파일 입출력이 너무 큽니다.'open','write','close'는 여러분이 이미 의도 한대로 쓰지 않아야합니다. 'write'. 던져진 것을 일상적으로 먹는 완충 대는 나쁜 디자인 [또는 배고픈 완충 대]이 될 것입니다. – Joey

+1

고마워요, 그건 제 추측이었습니다. 그러나이 진정한 크로스 플랫폼, 크로스 OS 및 교차 언어는 무엇입니까? –

+0

@Adam Matan : 그렇기 때문에 파이썬이 C 라이브러리 위에 놓이는 이유가 여기에 있습니다. "이 진정한 크로스 플랫폼, 크로스 OS"를 보장합니다. 나는 "교차 언어"가 무엇을 의미하는지 모른다. –

14

NB : close()flush()은 데이터가 실제로 디스크에서 안전함을 보장하지 않습니다. 그것은 단지 OS가 프로세스 내에서 버퍼링되지 않는다는 것을 보장합니다.

동기화 또는 fsync를 사용하여 디스크에 기록 된 데이터를 가져올 수 있습니다.

+0

프로세스 종료시 True이지만 최신 OS가 디스크에 데이터를 쓰지 않습니까? –

+0

당신이 말하는 시간 척도에 따라 다릅니다. 예 : 일부 버전의 ext4는 데이터를 디스크에 커밋하기 전에 1 초를 기다릴 수 있습니다. –

+0

+1 크기의 순서가 초이면 매우 안전합니다. 감사! –

-5

filehandle.close가 반드시 플러시되지는 않습니다. 놀랍게도 filehandle.flush는 도움이되지 않습니다. 파이썬이 돌아갈 때 OS 버퍼에 여전히 걸릴 수 있습니다. 내가 파일에 쓴이 세션을 관찰, 그것은 쉘 명령 프롬프트하려면 Ctrl-Z를 폐쇄하고 파일 검사 :

$ cat xyz 
ghi 
$ fg 
python 

>>> x=open("xyz","a") 
>>> x.write("morestuff\n") 
>>> x.write("morestuff\n") 
>>> x.write("morestuff\n") 
>>> x.flush 
<built-in method flush of file object at 0x7f58e0044660> 
>>> x.close 
<built-in method close of file object at 0x7f58e0044660> 
>>> 
[1]+ Stopped     python 
$ cat xyz 
ghi 

은 그 후 내가 파일을 다시 할 수 있습니다, 그것은 반드시 (파일 동기화에 있기 때문에 이 경우에는 추가 모드에서 열어 봅니다.) 다른 사람들이 말한 것처럼 sync syscall (os 패키지에서 사용 가능)은 모든 버퍼를 디스크로 플러시해야하지만 시스템 전반에 걸친 성능 영향을 미칠 수 있습니다 (시스템의 모든 파일을 동기화 함).

+13

흠 - 사실 당신이 실제로 ** ** flush() 또는 close()를 호출하지 않았다는 것이 당신의 문제라고 생각합니다. 그 방법들을 부르려면 괄호가 필요합니다. –