2017-09-20 37 views
0

반복기가있는 파일에서 값을 읽을 수 있습니까? 그러면 파일이 반복의 끝에서 자동으로 닫힙니 까?파일에서 값을 읽는 이터레이터

with 문을 사용하여 이러한 반복기를 만드는 것은 효과가없는 것처럼 보입니다. 당신은 당신이 할 필요가 with 사용하려면

with open('/dev/zero', 'rb') as f:            
    values = iter(f.read(1) for i in (1, 2, 3))         

values.next()    #ValueError: I/O operation on closed file           
+0

래퍼 클래스를 만들고'__iter__'과'__next__'를 구현하고'StopIteration'을 발생시킬 때'f .__ exit __() '를 호출해야합니다. –

+0

끝까지 반복하는 것을 잊어 버리거나 예외가 발생하면 파일 핸들이 누출 될 수 있기 때문에 시도하는 것이 바람직하지 않습니다. 파일의 모든 작업은'with' 내부에서 수행되어야합니다! – MSeifert

답변

2

:

def file_generator(filename): 
    with open(filename,'rb') as file: 
     for i in (1, 2, 3): 
      yield file.read(1) 

values = file_generator('/dev/zero') 
next(values) 

를이 반복자의 끝에 도달하지 않는 그러나 경우 본질적으로 그렇지 그래서, 당신은 파일을 닫습니다하지 않습니다 한번 당신이 할 수있는 경우에 모두 통과, 당신이 그것을 사용하여 수행되면 다음을 닫으 최선의 파일을 처리 할 때

file = open(filename,'rb') 
next(file) 
file.close() 

: 매우 다르다. 열린 파일에 핸들을 유지하는 것은 대개 신뢰할 수있는 솔루션이 아닙니다.

+1

프로덕션 코드에서 그렇게하지 마십시오. 생성기가 고갈되지 않았거나 예외가 발생하면 생성기가 삭제되지 않을 때 파일 핸들을 쉽게 유출 할 수 있습니다. (컨텍스트 내에서 'yield'를 사용하면'with '의 거의 모든 좋은 점은 무효화됩니다.) – MSeifert

+0

@MSeifert 동의 함. 그러나 OP는 파일에 반복자가 있기를 원하기 때문에 다음 두 호출 사이에 파일을 열어 두거나 닫아서 매번 다시 열지 만 만족할만한 해결책은 없습니다. 대체로 대부분의 경우 파일을 한꺼번에 처리 한 다음 닫거나 사용자 정의 사용을위한 특수 핸들을 구현하는 것이 가장 좋습니다. – Flynsee

+0

@MSeifert'.close()'가 호출되면 누수가 없어야합니다. 맞습니까? –

1

fileinput 모듈이이 작업을 수행합니다. 파일 열기 및 닫기는 자동으로 처리됩니다.

import fileinput 

files = ['path to file'] 

iterator = fileinput.input(files) 

for line in iterator: 
    print(line) 

당신은 input 방법에 여러 파일 경로의 목록을 제공 할 수 있으며 하나의 파일을 읽는 것처럼 그들의 라인을 반복합니다.

+0

감사합니다. 나는 표준'file' 객체가 이미 당신이 라인을 반복 할 수있게 해준다고 생각한다. 문제는 선이 아니거나 순차적이지 않은 데이터 비트를 반복 할 때입니다. –