2017-08-16 40 views
5

Używam biblioteki csv do parsowania pliku. Muszę pominąć 6 rzędów i przejść od razu do 7. rzędu i przeanalizować resztę. Jestem w stanie uruchomić reader.next() 6 razy, ale wygląda dziwnie:Czy istnieje sposób, aby przejść do określonego numeru linii podczas czytania pliku w Pythonie?

reader = csv.reader(csvfile) 

reader.next() 
reader.next() 
reader.next() 
reader.next() 
reader.next() 
reader.next() 

for row in reader: 
    print row 

Więc zastanawiam się, czy jest jakiś sposób aby pominąć 6 rzędów w inny sposób?

+0

dlaczego nie używaj cyklu dla tego 'dla i w zakresie (6): reader.next()' – varela

+0

może również: dla wiersza w liście (czytnik) [6:] - jednak nie jest najbardziej wydajny. –

Odpowiedz

10

Tak. Użyj itertools.islice:

from itertools import islice 
reader = csv.reader(csvfile) 

for row in islice(reader, 7, None): 
    print row 

Ten islice trwa iterable, wówczas następujące pozycyjne argumenty dużo pracować jak typowy list-krojenie start-stop-kroku:

>>> x = list(range(14)) 
>>> x[7:None] 
[7, 8, 9, 10, 11, 12, 13] 
>>> x[7:] 
[7, 8, 9, 10, 11, 12, 13] 
>>> 
>>> list(islice(x, 7, None)) 
[7, 8, 9, 10, 11, 12, 13] 

jednak żadnego negatywnego indeksowanie dozwolone.

>>> list(islice(x, -1, None)) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: Indices for islice() must be None or an integer: 0 <= x <= maxint. 
>>> 

Jednak nadal jest bardzo elastyczne, tak, na przykład, z co drugi rząd, począwszy od pierwszego (tj parzystych rzędów):

for row in islice(reader, None, None, 2): 
    print row 

lub co-innego rozruchu rzędu w drugim rzędzie (tzn nieparzystych wierszy):

for row in islice(reader, 1, None, 2): 
    print row 
0

można zrobić:

for i, row in enumerate(reader): 
    if i<7: continue 
    print row 

Można też owinąć że w generatorze:

for row in (e for i, e in enumerate(reader) if i>=7): 
    print row 

Jeśli chcesz pominąć pewne specyficzne linie:

for i, row in enumerate(reader): 
    if i in (1,13,666): continue # skip unlucky lines... 
    print row 

Albo, owijając że w generatorze:

for row in (e for i, e in enumerate(reader) if i not in (1,13,666)): 
    print row 
+0

Czy mogę zapytać, dlaczego głosowanie w dół? – dawg