[python] 파이썬에서“EOF는 아니지만”에 대한 완벽한 대응은 무엇입니까?

C 또는 Pascal에서 일부 텍스트 파일을 읽으려면 항상 다음 코드 조각을 사용하여 EOF까지 데이터를 읽습니다.

while not eof do begin
  readline(a);
  do_something;
end;

따라서 파이썬에서 어떻게 간단하고 빠르게 할 수 있을까요?



답변

파일을 반복하여 행을 읽습니다.

with open('somefile') as openfileobject:
    for line in openfileobject:
        do_something()

파일 객체는 반복 가능하며 EOF까지 줄을 양보합니다. 파일 객체를 iterable로 사용하면 버퍼를 사용하여 읽기를 수행합니다.

stdin으로 똑같이 할 수 있습니다 (사용할 필요가 없습니다 raw_input():

import sys

for line in sys.stdin:
    do_something()

그림을 완성하기 위해 다음을 사용하여 이진 읽기를 수행 할 수 있습니다.

from functools import partial

with open('somefile', 'rb') as openfileobject:
    for chunk in iter(partial(openfileobject.read, 1024), b''):
        do_something()

여기서 chunk파일에서 한 번에 최대 1024 바이트를 포함하고 openfileobject.read(1024)빈 바이트 문자열을 반환하기 시작 하면 반복이 중지됩니다 .


답변

Python에서 C 관용구를 모방 할 수 있습니다.

버퍼를 최대 max_size바이트 수 까지 읽으려면 다음을 수행하십시오.

with open(filename, 'rb') as f:
    while True:
        buf = f.read(max_size)
        if not buf:
            break
        process(buf)

또는 텍스트 파일을 한 줄씩 :

# warning -- not idiomatic Python! See below...
with open(filename, 'rb') as f:
    while True:
        line = f.readline()
        if not line:
            break
        process(line)

읽기에서 반환 된 바이트의 부족 외에 파이썬 에는 eof 테스트while True / break없기 때문에 구문 을 사용해야 합니다.

C에서는 다음이있을 수 있습니다.

while ((ch != '\n') && (ch != EOF)) {
   // read the next ch and add to a buffer
   // ..
}

그러나 파이썬에서는 이것을 가질 수 없습니다.

 while (line = f.readline()):
     # syntax error

Python의 표현식 에서는 할당이 허용되지 않기 때문입니다 (최신 버전의 Python은 할당 표현식을 사용하여이를 모방 할 수 있지만 아래 참조).

파이썬에서 이것을하는 것은 확실히 관용적입니다 :

# THIS IS IDIOMATIC Python. Do this:
with open('somefile') as f:
    for line in f:
        process(line)

업데이트 : Python 3.8부터 할당 표현식을 사용할 수도 있습니다 .

 while line := f.readline():
     process(line)


답변

파일을 열고 한 줄씩 읽는 Python 관용구는 다음과 같습니다.

with open('filename') as f:
    for line in f:
        do_something(line)

파일은 위 코드의 끝에서 자동으로 닫힙니다 ( with구성이 처리합니다).

마지막으로 line후행 개행을 보존 한다는 점 은 주목할 가치가 있습니다. 다음을 사용하여 쉽게 제거 할 수 있습니다.

line = line.rstrip()


답변

아래 코드 스 니펫을 사용하여 파일 끝까지 한 줄씩 읽을 수 있습니다.

line = obj.readline()
while(line != ''):

    # Do Something

    line = obj.readline()


답변

위의 “파이썬 방식으로하기”에 대한 제안이 있지만 실제로 EOF를 기반으로하는 논리를 갖고 싶다면 예외 처리를 사용하는 것이 그 방법이라고 생각합니다.

try:
    line = raw_input()
    ... whatever needs to be done incase of no EOF ...
except EOFError:
    ... whatever needs to be done incase of EOF ...

예:

$ echo test | python -c "while True: print raw_input()"
test
Traceback (most recent call last):
  File "<string>", line 1, in <module>
EOFError: EOF when reading a line

또는 프롬프트 Ctrl-Z에서 누르십시오 raw_input()(Windows, Ctrl-ZLinux).


답변

다음 코드 스 니펫을 사용할 수 있습니다. readlines ()는 전체 파일을 한 번에 읽고 한 줄씩 분할합니다.

line = obj.readlines()


답변

@dawg의 훌륭한 답변 외에도 해마 연산자를 사용하는 동등한 솔루션 (Python> = 3.8) :

with open(filename, 'rb') as f:
    while buf := f.read(max_size):
        process(buf)