2012-03-15 4 views
5

파이썬에서 파일 작업을 할 때 이상한 문제가 발생했습니다. 텍스트 파일과 파일의 내용을 읽고 변경되지 않은 내용으로 다시 작성하는 간단한 코드 조각이 있다고 가정 해 봅시다.파이썬의 읽기/쓰기 파일에 x00을 추가하십시오.

File.txt를

이것은 위의 코드 File.txt를 실행 한 후 테스트 파일

파이썬 코드

f=open(File.txt,'r+') 
data=f.read() 
f.truncate(0) 
f.write(data) 
f.close() 

것과 동일한 것 같다. 그러나 16 진수 편집기에서 열었을 때 텍스트 파일의 실제 내용 앞에 \x00 (NULL) 바이트가 많이 표시되는 것을보고 놀랐습니다. 그 전에 이 아니 었습니다.

누구든지 설명해 주실 수 있습니까?

답변

9

파일에 20 바이트가 있다고 가정합니다. 따라서 f.read()은 20 바이트를 읽습니다. 이제 파일을 0 바이트로 자릅니다. 하지만 파일의 위치는 여전히 20입니다. 왜 그렇게되지 않았을까요? 너는 그것을 옮기지 않았다. 그래서 쓸 때 21 번째 바이트에 쓰기 시작합니다. 운영 체제가 누락 된 20 바이트를 0으로 채 웁니다.

이 문제를 방지하려면 다시 쓰기 전에 f.seek(0)을 사용하십시오.

1

f.truncate(0)은 파일의 모든 바이트를 \x00으로 설정합니다. 그러나 파일 포인터을 변경하지 않습니다. read을 호출 한 후에도 여전히 해당 위치에 있습니다. 따라서 아무 것도 쓰지 않으면 운영 체제가 파일을 새로운 길이 (원래 길이 + len(data))로 확장합니다.

것을 방지하기 위해, seek 전화 :

with open('File.txt', 'r+') as f: 
    data=f.read() 
    f.seek(0) 
    f.truncate(0) 
    f.write(data) 
+0

아니, 아니, 아니. '.truncate'는 파일을 자릅니다. 그게 다야. null 바이트는 없다 코드가'f.truncate (0)'로 끝나면 파일의 크기는 0이됩니다. 이것은 OS가 파일 시스템에 의존하여 * 필기되지 않은 * 바이트를 널 바이트로 채우게하는 0과 다른 파일 오프셋에서의'.write '이다 (또는 필기없는 바이트가 널 (null)로 가정한다). – tzot

관련 문제