Does readlines () Restituisce una lista o di un iteratore in Python 3?
-
30-09-2019 - |
Domanda
Ho letto in "Dive Into Python 3" che "The readlines () metodo ora restituisce un iteratore, quindi è altrettanto efficiente quanto xreadlines () era in Python 2". Vedi qui: http://diveintopython3.org/porting-code- to-python-3-con-2to3.html . Non sono sicuro che sia vero, perché non ne parlano qui: http://docs.python.org/release/3.0.1/whatsnew/3.0.html . Come posso verificare che?
Soluzione
In questo modo:
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.
>>>
Altri suggerimenti
Il metodo readlines non restituisce un iteratore in Python 3, restituisce una lista ??p>
Help on built-in function readlines:
readlines(...)
Return a list of lines from the stream.
Per controllare, basta chiamare da una sessione interattiva - che restituirà un elenco, piuttosto che un iteratore:
>>> type(f.readlines())
<class 'list'>
Dive Into Python sembra essere sbagliato in questo caso.
xreadlines è stato href="http://www.python.org/download/releases/2.3/highlights/" rel="noreferrer"> Sconsigliata a partire da Python 2.3 quando gli oggetti di file è diventato il proprio iteratori. Il modo per ottenere la stessa efficienza xreadlines
è invece di usare
for line in f.xreadlines():
si dovrebbe usare semplicemente
for line in f:
In questo modo si ottiene l'iteratore che si desidera, e aiuta a spiegare perché readlines
non aveva bisogno di cambiare il suo comportamento in Python 3 - può ancora restituire un elenco completo, con l'idioma line in f
dando l'approccio iterativo, e il lungo xreadlines
-deprecated è stato rimosso completamente.
Altri hanno detto quanto già, ma solo per guidare il punto a casa, oggetti file ordinari sono i propri iteratori. Quindi, avendo ritorno readlines()
un iteratore sarebbe sciocco, perché sarebbe solo restituire il file chiamato su. È possibile utilizzare un ciclo for
per iterare su un file, come Scott ha detto, e si può anche passare loro direttamente a funzioni 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)