2013-08-02 3 views
1

은 다음과 같은 간단한 파이썬 코드를 고려 파일에서 라인을 읽고 않는 방법 : 루프 예에 대한 첫 번째에서파이썬은

f=open('raw1', 'r') 
i=1 
for line in f: 
    line1=line.split() 
    for word in line1: 
     print word, 
print '\n' 

"F의 라인 :"어떻게 파이썬 내가 줄을 읽고 싶은 것을 알고 않습니다 및 말이나 성격이 아닌가?

두 번째 루프는 line1이 목록이므로 더 명확합니다. 따라서 두 번째 루프는 목록 elemnts를 반복합니다.

+7

정의에 표시 되었기 때문에? Docs ->'파일에서 행을 읽으려면 파일 객체를 반복 할 수 있습니다. 이것은 메모리 효율적이고 빠르며 간단한 코드로 이어집니다. –

+2

Surkrit가 말했듯이 정의 된 동작의 문제 일뿐입니다. 반복자는 반복 할 때마다 원하는대로 지정할 수 있으며 파일이 어떻게 작동하는지 기록됩니다. 파이썬에서 파일 작업을 할 때, [with with'statement] (http://www.youtube.com/watch?v=lRaKmobSXF4)를 사용하면 모호한 버그를 막을 수 있으며, 읽을 수있는. –

+0

감사합니다. Sukrit and Lattyware – nish

답변

4

파이썬에는 "iterables"라는 표기법이 있습니다. 그들이 보유한 데이터를 트래버스하는 방법을 알고있는 것입니다. 일반적인 반복자는 목록, 집합, 사전, 거의 모든 데이터 구조입니다. 파일도 예외는 아닙니다.

일이 반복 가능한 방식은 next 메서드를 사용하여 객체를 반환하는 메서드를 정의하는 것입니다. 이 next 메서드는 반복적으로 호출되어 매번 다음 데이터 조각을 반환합니다. for foo in bar 루프는 사실 next 메서드를 반복적으로 호출하고 있습니다.

파일의 경우 next 메서드는 줄을 반환합니다. 그것은 당신이 선을 원한다는 것을 "알지 못합니다."그것은 항상 선을 반환 할 것입니다. 그 이유는 파일 탐색과 관련된 사례의 ~ 50 %가 줄 단위이므로 단어를 원한다면

for word in (word for line in f for word in line.split(' ')): 
    ... 

이 적합합니다.

+0

감사합니다. 또한 답변에서 언급 한 코드처럼 코드를 단순화하는 방법을 배울 수 있습니다. 당신이 내가 이것을 배울 수있는 링크를 말해 줄 수 있다면, 그것은 매우 도움이 될 것입니다. – nish

+0

(다소 복잡한) 생성자 표현식을 사용하고 있습니다. 문서에 대해 자세히 알고 싶다면 http://docs.python.org/2/reference/expressions.html#generator-expressions을 참조하십시오. – jozefg

3

파이썬에서는에 대한 구문이 iterables (반복 가능한 요소)보다 많이 사용됩니다. 파일 객체의 경우 반복자는 파일 자체입니다.

다음() 방법의 설명서를 here를 참조하시기 바랍니다 - 아래에 붙여 발췌 :

파일 오브젝트은 F가 종료되지 않는 한 ITER는 (F) ( f를 반환 예를 들어, 자신의 반복자입니다). 파일이 반복자 (일반적으로 )의 for 루프 (예 : f : print 행의 행)로 사용되면 next() 메서드 이 반복적으로 호출됩니다. 이 메서드는 다음 입력 행을 반환하거나 파일을 열어 으로 열 때 EOF가 눌려지면 이 StopIteration을 발생시킵니다. 파일이 쓰기 위해 열릴 때 동작은 정의되지 않습니다. for 루프를 파일 (매우 일반적인 작업)의 줄에서 반복하는 가장 효율적인 방법으로 만들기 위해 next() 메서드는 숨겨진 미리 읽기 버퍼를 사용합니다. 미리 읽기 버퍼를 사용하는 결과로 인해 next()를 다른 파일 메소드 (예 : readline())와 결합하면 이 올바르게 작동하지 않습니다. 그러나 seek()을 사용하여 파일을 절대 위치로 재배치하면 미리 읽기 버퍼가 플러시됩니다. 버전 의 새로운 기능 2.3.