파이썬에서 "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
'programing' 카테고리의 다른 글
오라클 임시 테이블에 인덱스를 올려도 안전합니까? (0) | 2023.07.21 |
---|---|
일정한 시간이 지난 후에 중단되는 경우 Spring Scheduled 실행 중지 (0) | 2023.07.21 |
자바.java.javaClassCastException: javax.xml.bind입니다.JAXB 요소를 캐스트할 수 없습니다. (0) | 2023.07.21 |
데이터베이스에 "(빈 문자열)을 NULL이 아닌 값으로 저장할 수 있습니까? (0) | 2023.07.21 |
메모장++에서 파이썬 스크립트를 실행하는 방법? (0) | 2023.07.21 |