본문 바로가기
Algorithm/Algorithm

[Python] EOF 처리하기

by minhi 2024. 7. 3.

백준 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