문제

다음 파일이 있습니다.

abcde
kwakwa
<0x1A>
line3
linllll

어디 <0x1A> 16진수 값이 0x1A인 바이트를 나타냅니다.Python에서 이 파일을 다음과 같이 읽으려고 할 때:

for line in open('t.txt'):
    print line,

처음 두 줄만 읽고 루프를 종료합니다.

해결책은 파일을 바이너리(또는 범용 개행 모드)('rb' 또는 'rU')로 여는 것 같습니다.이 동작을 설명할 수 있나요?

도움이 되었습니까?

해결책

0x1a는 Ctrl-z이며, DOS는 역사적으로이를 파일 종료 마커로 사용했습니다. 예를 들어 명령 프롬프트를 사용하고 파일을 "입력"하십시오. CTRL-Z에 만 내용을 표시합니다.

Python은 Windows CRT 기능 _wfopen을 사용하여 "Ctrl-Z는 EOF"시맨틱을 구현합니다.

다른 팁

네드 물론 맞습니다.

호기심이 좀 더 깊어진다면 근본 원인은 극단적인 이전 버전과의 호환성 때문입니다.Windows는 Ctrl-Z를 텍스트 파일의 선택적 파일 끝 표시로 사용하는 DOS와 호환됩니다.여러분이 모르실 수도 있는 사실은 DOS가 PC 이전에 소형 컴퓨터에서 널리 사용되었던 CP/M과 호환된다는 것입니다.CP/M의 파일 시스템은 파일 크기를 바이트 수준까지 추적하지 않고 플로피 디스크 섹터 수로만 추적했습니다.파일이 128바이트의 정확한 배수가 아닌 경우 텍스트 끝을 표시하는 방법이 필요했습니다. 이 위키피디아 기사 이는 Ctrl-Z 선택이 DEC에서 사용하는 훨씬 오래된 규칙을 기반으로 한다는 것을 의미합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top