programing

파이썬에서 "EOF가 아닌 동안"에 대한 완벽한 대응물은 무엇입니까?

bestprogram 2023. 7. 21. 21:45

파이썬에서 "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까지 선을 생성합니다.파일 개체를 반복 가능한 항목으로 사용하면 버퍼를 사용하여 읽기 성능을 보장합니다.

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)빈 바이트 문자열을 반환하기 시작합니다.

당신은 파이썬에서 Cidiom을 모방할 수 있습니다.

버퍼 읽기 최대 시간max_size(>0) 바이트 수, 다음을 수행할 수 있습니다.

with open(filename, 'rb') as f:
    while True:
        buf = f.read(max_size)
        if buf == 0:
            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)

사용해야 합니다.while True / break읽기에서 반환된 바이트 부족 외에 Python에 테스트 eo가 없기 때문에 구성합니다.

C에서 다음을 가질 수 있습니다.

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

그러나 Python에서는 이 기능을 사용할 수 없습니다.

 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)

이는 라인 읽기가 공백인 경우에도 작동하며 EOF까지 계속됩니다.

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

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

또는 다음 위치에서 를 누릅니다.raw_input()프롬프트(윈도우즈, 리눅스)

@digg의 훌륭한 답변 외에도 바다코끼리 연산자를 사용한 동등한 솔루션(Python > = 3.8):

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

다음 코드 조각을 사용할 수 있습니다.readlines는 전체 파일을 한 번에 읽고 줄별로 분할합니다.

line = obj.readlines()

이거 어때요?간단하게!

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

추가 라인을 낭비할 필요가 없습니다.사용할 필요가 없습니다.with파일 개체에 대한 참조가 없을 때 파일이 자동으로 닫히기 때문에 키워드를 지정합니다.

언급URL : https://stackoverflow.com/questions/15599639/what-is-the-perfect-counterpart-in-python-for-while-not-eof