2010-08-22 10 views
8

W języku Python 2 obiekty plików miały metodę xreadlines(), która zwróciła iterator, który odczytałby plik po jednej linii naraz. W języku Python 3 metoda xreadlines() już nie istnieje, a realines() nadal zwraca listę (nie jest iteratorem). Czy Python 3 ma coś podobnego do xreadlines()?Co zastępuje xreadlines() w Pythonie 3?

wiem, że mogę zrobić

for line in f: 

zamiast

for line in f.xreadlines(): 

Ale chciałbym również użyć xreadlines() bez pętli for:

print(f.xreadlines()[7]) #read lines 0 to 7 and prints line 7 
+1

You * nie może * Indeks iterator. 'zip ([1,2,3], [4,5,6]) [0]' -> błąd. – kennytm

+0

@KennyTM Masz rację. Usunąłem część mnie mówiącą "możesz indeksować iterator". Myślałem, że mogę indeksować iterator, ponieważ mogę zrobić zakres (10) [7], ale to nie znaczy, że mogę indeksować iterator. Dzięki. – snakile

Odpowiedz

12

obiekt File samo w sobie jest już iterable.

>>> f = open('1.txt') 
>>> f 
<_io.TextIOWrapper name='1.txt' encoding='UTF-8'> 
>>> next(f) 
'1,B,-0.0522642316338,0.997268450092\n' 
>>> next(f) 
'2,B,-0.081127897359,2.05114559572\n' 

Use itertools.islice uzyskać dowolny element z iterable.

>>> f.seek(0) 
0 
>>> next(islice(f, 7, None)) 
'8,A,-0.0518101108474,12.094341554\n' 
1

jak o tym wypowiedzi (generatora):

>>> f = open("r2h_jvs") 
>>> h = (x for x in f) 
>>> type(h) 
<type 'generator'>`