2016-10-18 4 views
0

저는 루프와 파일을위한 파이썬에 관련된 질문이 있습니다. 이 코드에서파일 객체에서 for 루프가 수행하는 작업은 무엇입니까?

:

file = raw_input("input a text file ") 

f = open(file) # creates a file object of file 

for line in f: 
    # prints each line in the file 
    print line 



print f 

# prints <open file 'MVL_ref.txt', mode 'r' at 0x0267D230> 

print f.read() # same output of the for-cycle 
print f.readline() # same output of the for-cycle 

에 대한 루프 내 텍스트 파일에 존재하는 각 행을 인쇄한다. 그러나 파일 객체를 인쇄하면 나는 완전히 다른 것을 얻습니다. 나는 같은 것을 사용했다는 것을 기대하기 때문이 날 퍼즐 :

for line in f.read(): 
    print line 

그러나 물론 이러한 경우가

. for-loop없이 read 또는 readline 메소드를 사용하면 for-loop의 동일한 출력을 얻습니다.

for 루프는 파일 객체에 대해 read() 또는 readline()을 호출하는 것과 같은 마법을 사용합니까? 파이썬으로 코드 작성하는 법을 배우고 있지만 코드가 "내 등 뒤에서"무엇을하는지 거의 이해하지 못합니다.

앞으로 올 모든 설명에 감사드립니다.

+3

개체에 대한 설명을 볼 수 있습니다 뭐하는거야? –

+0

'for line in f.read() :'... 변수 이름을 혼동하지 마십시오. 그것들은 줄이 아니며 그것들은 하나의 문자입니다 –

+0

줄 문자가 이미 "\ n"인 경우 txt 파일에 실제로 의존합니다. ** 사용은 필요 없습니다 ** read() ** method –

답변

2

파이썬의 파일 객체가 iterable이므로 파일의 라인을 하나씩 가져 오기 위해 반복 할 수 있습니다. 파일이 수집하지만 대상이 아닌 그러나

- 당신은 수집

l = ["line1", "line2"] 
print l 

를 출력 할 때이 같은를 인쇄하여 모든 행을 볼 수 없습니다하지만 당신은 코멘트 정확히 말한다

<open file 'path_to_the_file', mode 'r' at 0x0245D020> 
+0

설명을 주셔서 감사합니다. 다시 말하면, for-loop의 경우 파일 객체는 컬렉션처럼 동작합니다. – Faber

+0

예. 하나씩 줄을 얻을 수있는 반복자를 반환 할 수 있기 때문에 가능합니다. –

+0

마지막 답은 반복자, 반복 가능, __iter__을 찾습니다. , 다음 및 다른 것들. 실제로 무시 된 루프 뒤에는 많은 일들이 일어나고 있습니다. 고마워요! – Faber

관련 문제