2017-04-14 17 views
-1

, 나는이 말 :readline()이 readlines() 이후에 작동하지 않는 이유는 무엇입니까? 파이썬에서

f = open("file.txt", "r") 
    a = f.readlines() 
    b = f.readline() 
    print a 
    print b 

print a 파일의 모든 라인을 보여줍니다 및 print b 아무것도 표시되지 않습니다.

마찬가지로 그 반대의 경우도 마찬가지 :

f = open("file.txt", "r") 
    a = f.readline() 
    b = f.readlines() 
    print a 
    print b 

print a은 첫 번째 줄을 표시하지만 print b은 첫 번째 제외한 모든 행을 표시합니다.

ab이 readlines() 인 경우 a은 모든 행을 표시하고 b은 아무 것도 표시하지 않습니다.

왜 이런 일이 발생합니까? 두 명령이 서로 독립적으로 작동 할 수없는 이유는 무엇입니까? 이 문제를 해결할 수있는 방법이 있습니까?

+2

Readlines는 모든 행을 읽습니다. 따라서 파일의 시작 부분으로 다시 탐색하지 않는 한 읽을 내용이 없습니다. –

답변

3

먼저 .readlines()을 수행하면 .readline()을 가져 오기 위해 아무 것도 남기지 않고 모든 읽기 버퍼를 소비하게됩니다. 처음으로 돌아가고 싶다면 .seek(0)을 @abccd로 사용하십시오. readlines이 파일의 모든 라인을 읽을 수 있도록 라인을 읽고 왼쪽으로 더 이상이 없다

>>> from StringIO import StringIO 
>>> buffer = StringIO('''hi there 
... next line 
... another line 
... 4th line''') 
>>> buffer.readline() 
'hi there\n' 
>>> buffer.readlines() 
['next line\n', 'another line\n', '4th line'] 
>>> buffer.seek(0) 
>>> buffer.readlines() 
['hi there\n', 'next line\n', 'another line\n', '4th line'] 
2

때문에, 다시 처음으로 돌아가서 거기에서 읽을 f.seek(0)를 사용하여 파일을 다시 읽을 수 있습니다.

1

파일에는 읽거나 쓸 때마다 업데이트되는 바이트 오프셋이 있습니다. 이것은 당신이 처음에 기대했던 수행합니다

with open("file.txt") as f: 
    a = f.readlines() 
    f.seek(0) # seek to the beginning of the file 
    b = f.readline() 

지금 a가 모든 라인과 b 그냥 첫 번째 줄입니다.