답변:
파일을 반복하여 행을 읽습니다.
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)
빈 바이트 문자열을 반환하기 시작 하면 반복이 중지됩니다 .
stdin
실행중인 프로세스에서 읽고 있으므로 프로세스를 죽일 때까지 EOF가 없습니다. 그러나 나는 "지금까지의 끝"에 도달하고 나는 교착 상태에 빠진다. 교착 상태가 아닌 이것을 어떻게 감지합니까? 새 줄이없는 것처럼 파일 읽기를 중지합니다 (내 경우에는 존재하지 않는 EOF가 없더라도).
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)
readline()
방법 에는 이점이있는 것 같습니다 . UnicodeDecodeError
관용적 인 for
반복 으로는 할 수없는 catching과 같은 세분화 된 오류 처리를 수행 할 수 있습니다 .
파일을 열고 한 줄씩 읽는 Python 관용구는 다음과 같습니다.
with open('filename') as f:
for line in f:
do_something(line)
파일은 위 코드의 끝에서 자동으로 닫힙니다 ( with
구성이 처리합니다).
마지막으로 line
후행 개행을 보존 한다는 점 은 주목할 가치가 있습니다. 다음을 사용하여 쉽게 제거 할 수 있습니다.
line = line.rstrip()
for line in f.readlines(): ...
합니다.
아래 코드 스 니펫을 사용하여 파일 끝까지 한 줄씩 읽을 수 있습니다.
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()
line
끝에 줄 바꿈 문자가 있습니다.