Przeczytałem w "Dive into Python 3", że "Metoda readlines() zwraca teraz iterator, więc jest tak samo skuteczny, jak xreadlines() było w Pythonie 2". Zobacz tutaj: http://diveintopython3.org/porting-code-to-python-3-with-2to3.html. Nie jestem pewien, czy to prawda, ponieważ nie wspominają o tym tutaj: http://docs.python.org/release/3.0.1/whatsnew/3.0.html. Jak mogę to sprawdzić?Czy readlines() zwraca listę lub iterator w Pythonie 3?
Odpowiedz
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.
>>>
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():
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.
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)
Spodziewam się, że ktoś, kto był przy użyciu 'dla linii f.xreadlines() : 'zamieni go na' dla linii w f: 'lata temu. –
@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. –
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