2010-08-22 5 views
23

필자는 "readlines() 메소드가 이제 반복자를 반환하므로 Python 2에서 xreadlines()가 사용 된 것과 똑같은 효율성을가집니다"라는 "Python 3으로 다이브"를 읽었습니다. 여기를 참조하십시오 : http://diveintopython3.org/porting-code-to-python-3-with-2to3.html. 그들이 여기에 언급하지 않기 때문에 그것이 사실이라는 것을 나는 확신하지 못한다 : http://docs.python.org/release/3.0.1/whatsnew/3.0.html. 어떻게 확인할 수 있습니까? readlines 메쏘드 방법은 파이썬 3에서 반복자를 반환하지 않습니다readlines()는 파이썬 3에서리스트 또는 반복자를 반환합니까?

답변

17

:

Python 3.1.2 (r312:79149, Mar 21 2010, 00:41:52) [MSC v.1500 32 bit (Intel)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> f = open('/junk/so/foo.txt') 
>>> type(f.readlines()) 
<class 'list'> 
>>> help(f.readlines) 
Help on built-in function readlines: 

readlines(...) 
    Return a list of lines from the stream. 

    hint can be specified to control the number of lines read: no more 
    lines will be read if the total size (in bytes/characters) of all 
    lines so far exceeds hint. 

>>> 
24

, 그것은

Help on built-in function readlines: 

readlines(...) 
    Return a list of lines from the stream. 

그냥 대화 형 세션에서 호출 확인하려면 목록을 반환 - 오히려 반복자보다, 목록을 반환에게 :

>>> type(f.readlines()) 
<class 'list'> 

이 경우에는 다이빙이 잘못된 것처럼 보입니다. 파일 객체가 자신의 반복자를되었을 때


xreadlines

deprecated since Python 2.3하고있다. xreadlines과 동일한 효율을 얻을 수있는 방법은 대신 사용하는 것입니다

for line in f.xreadlines(): 

you should use simply

for line in f: 

이 당신에게 당신이 원하는 반복자를 가져오고 readlines는 변경하지 않은 이유를 설명하는 데 도움이 그 Python 3에서의 동작 - 여전히 전체 목록을 반환 할 수 있으며 line in f 관용구는 반복적 인 접근 방식을 제공하고 오래 사용되지 않는 xreadlines은 완전히 제거되었습니다. 이처럼

+0

내가 기대하는 f.xreadlines에서 줄을'사용하던 사람() :'는''f :'년 전에 'for line in for :'으로 변환 할 것입니다. –

+0

@John Machin : Python 2에서 'xreadlines'이 선호되는 방법이라는 것을 의미하지는 않습니다. Python 2에서는 더 이상 사용되지 않을 것입니다. 파일 - 이터레이터 (iterator) 메소드가 도입되었습니다. 방금 파이썬 3에서 제거 될 수있는 이유를 설명하려고했습니다. –

+2

1 주일 전에 필자가 직접 파일을 자신의 반복자로 발견했습니다. (필자는 1.5 이후에 튜토리얼/릴리스 노트를 보지 못했다고 생각합니다.) – wbg

7

다른 사람이 이미 많이했다,하지만 바로 포인트 집으로 운전, 일반 파일 객체는 자신의 반복자입니다. 따라서 readlines()을 반환하는 것은 반복자가 어리석은 일이 될 것입니다. 반복자가 호출 한 파일을 반환하기 때문입니다. 스콧이 말한 것처럼 당신은 파일을 반복하는 for 루프를 사용할 수 있으며, 또한 itertools 기능에 바로 전달할 수 있습니다

from itertools import islice 
f = open('myfile.txt') 
oddlines = islice(f, 0, None, 2) 
firstfiveodd = islice(oddlines, 5) 
for line in firstfiveodd: 
    print(line) 
관련 문제