2009-09-30 18 views
9

Często muszę przetwarzać duże pliki tekstowe zawierające nagłówki w pierwszym wierszu. Nagłówki są często traktowane inaczej niż treść pliku lub przetwarzanie mojego ciała zależy od nagłówków. Tak czy inaczej muszę traktować pierwszą linię jako specjalny przypadek. mogę używać prostych linii iteracji i ustawić flagę:Jak inaczej traktować pierwszy wiersz pliku w Pythonie?

headerProcessed = false 
for line in f: 
    if headerProcessed: 
     processBody(line) 
    else: 
     processHeader(line) 
     headerProcessed = true 

ale lubię test w pętli, który jest zbędny dla wszystkich, ale jeden z milionów razy to realizuje. Czy istnieje lepszy sposób? Czy mogę potraktować pierwszą linię inaczej, a następnie rozpocząć iterację w drugiej linii? Czy powinienem się przejmować?

Odpowiedz

15

Mogłabyś:

processHeader(f.readline()) 
for line in f: 
    processBody(line) 
+3

Dzięki Greg. Jest to dokładnie to, co bym oczekiwał, ale w jakiś sposób założyłem, że pozycja pliku zostanie zresetowana na początku pętli for. Lekcja w języku Python: należy oczekiwać prostej metody działania! –

+3

Kolejna lekcja do nauki: sprawdź swoje założenia. Mogłeś go po prostu wypróbować i dowiedzieć się, ale wtedy wszyscy nie skorzystalibyśmy z tej interesującej wymiany! – Todd

+0

Powyższe działa, ale ogólnie można uzyskać: "ValueError: miksowanie iteracji i metod odczytu utraci dane". – jfs

3

Zastosowanie ITER()

it_f = iter(f) 
header = it_f.next() 
processHeader(header) 

for line in it_f: 
    processBody(line) 

Współpracuje z dowolnym iterowalny obiektu.

+3

Myślę, że "iteratorable" jest po prostu godna podziwu. – PaulMcG

+1

Dzięki za poprawkę: D –

8
f = file("test") 
processHeader(f.next()) #or next(f) for py3 
for line in f: 
    processBody(line) 

To działa.

Edit:

Zmieniono .__next__ do next (oni odpowiednik, ale przypuszczam, że obok jest bardziej zwięzły).

Regaring file vs open, file prostu wydaje się bardziej jasne dla mnie, więc będę nadal wolą go open.

+2

Dla Pythona 3, mówisz 'next (f)' – u0b34a0f6ae

+1

Zauważ, że 'open()' jest preferowane do 'file()', tutaj. "plik" najlepiej jest używać jako typu ('isinstance (...)'). – EOL

+0

Wersja Py3 nie powinna być 'f .__ następna __()' ale 'następna (f)' - metody podwójnie podkreślenia nie powinny być wywoływane bezpośrednio. – PaulMcG

2

Duże pliki tekstowe z nagłówkami w pierwszym wierszu? Więc to dane tabelaryczne.

Aby się upewnić: Czy obejrzałeś moduł csv? Powinien obsługiwać wszystkie dane tabelaryczne z wyjątkiem takich, w których pola nie są rozdzielane, ale definiowane według pozycji. I robi też nagłówek.

+0

Dzięki Lennart, tak, często korzystam z doskonałego modułu csv. –

Powiązane problemy