2010-08-22 10 views

Odpowiedz

17

Jak to:

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

Sposób readlines nie zwraca iterator w Pythonie 3, zwraca listę

Help on built-in function readlines: 

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

Aby to sprawdzić, wystarczy zadzwonić z sesji interaktywnej - zwróci listę zamiast iteratora:

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

Zanurkuj w Pythonie wydaje się być w tym przypadku błędny.


xreadlines został deprecated since Python 2.3 gdy obiekty plików stał własne iteratory. Sposób, aby uzyskać taką samą skuteczność jak xreadlines to zamiast używać

for line in f.xreadlines(): 

you should use simply

for line in f: 

ten dostaje iteracyjnej, który chcesz, i pomaga wyjaśnić, dlaczego readlines nie trzeba zmieniać jego zachowanie w Pythonie 3 - nadal może zwracać pełną listę z idiomem line in f, co daje podejście iteracyjne, a długo-przestarzałe xreadlines zostało całkowicie usunięte.

+0

Spodziewam się, że ktoś, kto był przy użyciu 'dla linii f.xreadlines() : 'zamieni go na' dla linii w f: 'lata temu. –

+0

@John Machin: Miałbym taką nadzieję (choć może tego nie oczekiwałam!) Nie chciałem sugerować, że 'xreadlines' był preferowanym sposobem na to w Pythonie 2 - był on przestarzały w Pythonie 2.3, kiedy wprowadzono metodę file-as-iterator. Po prostu chciałem podać powód, dla którego można go usunąć w Pythonie 3. –

+2

Odkryłem tylko, że pliki były ich własnymi iteratorami około tygodnia temu :(Myślę, że to mi służy, bo nie patrzę na notatki z samouczka/wydania od 1.5. – wbg

7

Inni powiedział jak dużo już, ale po prostu pojechać do domu punkt, zwykłe przedmioty plików są ich własne iteratory. Zatem zwracanie readlines() spowoduje, że iterator będzie głupi, ponieważ po prostu zwróci plik, do którego go wywołałeś. Można użyć for pętli iteracyjne nad plikiem, jak Scott powiedział, można również przekazać je prosto do itertools funkcji:

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