2014-11-13 1 views
1

오프셋 값 (file.tell) 파일을 유지하려고하므로 다시 시작할 때 프로세스가 그 많은 문자를 건너 뛸 수 있습니다.파일에 파이썬 쓰기 null 문자를 앞에

그래서 나는 truncate/write/flush 시퀀스를 가지고있다. 그러나 매번 널 문자를 파일의 맨 위에 놓습니다. 패턴은 이전 파일 내용의 길이와 동일한 수의 널 문자를 나타냅니다.

다음 세션을 재현했습니다. 이 null을 얻지 못하는 방법을 알아내는 데 도움을 주셔서 감사합니다.

고마워요.

[email protected] ~/lab $ python 
Python 2.6.8 (unknown, Jul 16 2013, 14:48:55) 
[GCC 4.3.4 [gcc-4_3-branch revision 152973]] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import os,fcntl 
>>> f=os.open("ha.offset", os.O_RDWR, 0744) 
>>> fcntl.lockf(f, fcntl.LOCK_EX | fcntl.LOCK_NB) 
>>> fd = os.fdopen(f, "w+") 
>>> msg="first=123\nsecond=234\n" 
>>> fd.truncate(0) 
>>> fd.write(msg) 
>>> fd.flush() 
>>> 
[1]+ Stopped     python 
[email protected] ~/lab $ wc ha.offset 
2 2 21 ha.offset 
[email protected] ~/lab $ fg 
python 
>>> msg="first=987\nsecond=9877\n" 
>>> fd.truncate(0) 
>>> fd.write(msg) 
>>> fd.flush() 
>>> 
[1]+ Stopped     python 
[email protected] ~/lab $ wc ha.offset 
2 2 43 ha.offset 
[email protected] ~/lab $ od -c ha.offset 
0000000 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 
0000020 \0 \0 \0 \0 \0 f i r s t = 9 8 7 \n s 
0000040 e c o n d = 9 8 7 7 \n 
0000053 
[email protected] ~/lab $ fg 
python 
msg="first=1" 
msg="first=1" 
>>> fd.truncate(0) 
>>> fd.write(msg) 
>>> fd.flush() 
>>> 
[1]+ Stopped     python 
[email protected] ~/lab $ !od 
od -c ha.offset 
0000000 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 
* 
0000040 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 f i r s t 
0000060 = 1 
0000062 

답변

1

파일의 위치가 유지된다는 docs for truncate 상태 :

file.truncate ([크기])

파일 사이즈 자르기. 선택적인 size 인수가 있으면 파일은 그 크기 이하로 잘립니다. 크기의 기본값은 현재 위치입니다. 현재 파일 위치는 변경되지 않습니다. 지정된 사이즈가 파일의 현재의 사이즈를 넘는 경우, 결과는 플랫폼에 의존합니다. 파일에 변경이없는 경우, 지정된 사이즈가 제로로 채워지는 경우, 또는 미정 도리의 새로운 컨텐츠로 지정된 사이즈로 증가하는 경우가 있습니다. 가용성 : Windows, 많은 Unix 계열.

그럼 첫 번째와 두 번째 기록 사이에 단지 fd.seek(0)이 필요하다고 생각됩니다.

+0

감사합니다. 항상 RTFM! – Dinesh

+0

@Dinesh 문제 없습니다. 모두에게 발생합니다. –