2014-03-27 5 views
0

내가 파이썬에 새로운 오전과 나는 아래의 코드를 이해하는 데 도움이 필요 -파이썬 파일 핸들러 재사용?

def main(): 
    print('main') 

    fh = open('C:\\Python\\lines.txt') 
    for line in fh.readlines(): 
     print(line, end = '') 

    fh = open('C:\\Python\\lines.txt') 
    for index,line in enumerate(fh.readlines()): 
     print(index, line, end = '') 

if __name__ == "__main__":main() 

내가 ... 두 번째 FH = 열린 제거하면, 루프 다음 ​​ 두 번째는 인쇄되지 않습니다. 왜 ?

+0

'fh.seek (0)'? 핸들의 내부 위치를 재설정해야합니다. –

답변

5

primer or a tutorial on the best practices with dealing with file handlers을 통해 읽어야합니다. fh의 첫 번째 인스턴스를 닫지 않았기 때문에 더 큰 프로그램에서 열려있는 파일 핸들이 너무 많아서 시스템 커널이 프로그램에 실패하는 문제가 발생합니다. 이는 분명히 나쁜 일입니다. 기존의 언어에서 당신은 더 많은 춤을해야하지만, 파이썬에서 당신은 단지 상황에 맞는 관리자 사용할 수 있습니다

with open('C:\\Python\\lines.txt') as fh: 
    for line in fh.readlines(): 
     print(line, end = '') 

물론, 파일 위치가 파일을 읽을 때마다 변경되는 일이며, 그 넣을 것 끝으로 위치, 당신이 원하는 경우 읽기의

with open('C:\\Python\\lines.txt') as fh: 
    for line in fh.readlines(): 
     print(line, end = '') 

    for line in fh.readlines(): 
     print(index, line, end = '') 

두 번째 세트는 루프 둘 사이에 fh.seek(0)을하지 않는 한 아무 것도 읽을 수 없습니다 그래서.

+0

예, fh를 더 이상 사용하지 않으면'fh.close()'를 넣어야합니다. –

+2

'with'를 사용하지 않으면 파일 핸들러 컨텍스트 관리자가 닫는 것을 처리 할 것이기 때문입니다. – metatoaster

2

파일 핸들에 위치 포인터가 포함되어 있습니다. fh.tell을 사용하여 현재 위치를 확인할 수 있습니다. 각 행의 파일을 통해 이동합니다. 일단 줄 끝까지 도달하면 다시 반복 할 때이 포인터를 다시 설정해야합니다. fh.seek(0)은이를 달성 할 것입니다.

+0

감사합니다. 이 API/문서는 어디에 있습니까? –

+1

@BoratSagdiyev - http://docs.python.org/2.7/library/stdtypes.html#bltin-file-objects –

+0

감사합니다. 파이썬 apis보기가 복잡하고 추한. Java는 훨씬 더 깨끗합니다. 어쨌든, 나는 그걸로 살거야. –