백준 10951번을 풀고 EOF에 대해 더 확실하게 알아보고자 정리해보았다.
EOF (End of File)
데이터 소스로부터 더 이상 읽을 수 있는 데이터가 없는 상태
윈도우 환경에서는 ctrl+z로 EOF를 표현한다.
Python에서 입력을 받는 방식엔 크게 input()과 sys.stdin.readline()가 있는데 각각 EOF를 어떻게 처리하는지 알아보자.
다음은 EOF를 넘겨받을 때까지 한 줄씩 입력받아 리스트 A에 추가하는 코드이다.
1. input()
A = []
while True:
try:
a = input()
A.append(a)
except EOFError:
print(A)
break
1
2
3
4
^Z
['1', '2', '3', '', '4']
2. sys.stdin.readline()
import sys
A = []
while True:
a = sys.stdin.readline()
if a == "":
print(A)
break
else:
A.append(a)
1
2
3
4
^Z
['1\n', '2\n', '3\n', '\n', '4\n']
여기서 생기는 궁금증,
sys.stdin.readline()의 EOF 처리는 try~except EOFError로 못 하나?
import sys
A = []
while True:
try:
a = sys.stdin.readline()
A.append(a)
except EOFerror:
print(A)
break
1
2
3
4
^Z
^Z
EOF를 넘겨도 계속 입력된다
위와 같은 현상이 나타나는 이유는
input()은 EOF를 받으면 EOFError를 반환하지만
sys.stdin.readline()은 EOF를 받으면 빈 문자열을 반환하기 때문이다.
더보기
더보기
import sys
A = []
for i in range(6):
try:
a = sys.stdin.readline()
A.append(a)
except EOFerror:
print(A)
break
print(A)
1
2
3
4
^Z
['1\n', '2\n', '3\n', '\n', '4\n', '']
앞의 무한루프를 유한루프로 수정해 sys.stdin.readline()은 EOF를 빈 문자열로 반환함을 확인할 수 있다.
따라서 sys.stdin.readline()은 except EOFError가 아닌 빈 문자열 여부로 EOF를 처리해야 한다.
'Algorithm > Algorithm' 카테고리의 다른 글
[Python] 이중 for문 빠져나오기 (0) | 2024.07.16 |
---|