2013-08-26 16 views
5

Załóżmy, że chcemy przetworzyć każdy wiersz pliku, ale ostatnia linia wymaga specjalnego traktowania:W języku Python, jak sprawdzić, czy linia jest ostatnia?

with open('my_file.txt') as f: 
    for line in f: 
     if <line is the last line>: 
      handle_last_line(line) 
     else: 
      handle_line(line) 

Pytanie jest, w jaki sposób można zaimplementować? Wydaje się, że nie ma funkcji wykrywania końca pliku w Pythonie.

Czy istnieje inne rozwiązanie niż odczytanie linii na liście (za pomocą f.readlines() lub podobnego)?

+0

czytać wszystkie i kawałek? –

Odpowiedz

13

Proces linia poprzednie:

with open('my_file.txt') as f: 
    line = None 
    previous = next(f, None) 
    for line in f: 
     handle_line(previous) 
     previous = line 

    if previous is not None: 
     handle_last_line(previous) 

Gdy pętla kończy się, wiesz, że ostatni wiersz po prostu czytać.

generycznej wersji, co pozwala przetwarzać N ostatnie linijki osobno używać collections.deque() object:

from collections import deque 
from itertools import islice 

with open('my_file.txt') as f: 
    prev = deque(islice(f, n), n) 
    for line in f: 
     handle_line(prev.popleft()) 
     prev.append(line) 

    for remaining in prev: 
     handle_last_line(remaining) 
+0

+1 Chciałem to tylko zasugerować. – arshajii

+0

Może warto zagnieżdżać to w 'for''' else' na czytelność? – scohe001

+0

Bardziej ogólnie można użyć kolejki do wdrożenia opóźnienia przetwarzania o dowolnym rozmiarze. –

3

Można użyć itertools.tee iteracyjne w dwóch egzemplarzach od uzyskania iterable:

next_lines, lines = itertools.tee(file_object) 
next(next_lines) 
for next_line, line in zip(next_lines, lines): 
    handle_line(line) 
last_line = next(lines, None) 
if last_line is not None: 
    handle_last_line(last_line) 
+0

Twoja ostatnia obsługa linii może być prostsza; po prostu wykonaj 'dla last_line w liniach: handle_last_line (last_line)'. –

+0

@MartijnPieters Twierdzę, że nawet jeśli jest krótszy, nie jest bardziej czytelny. Może nie być oczywiste, że pętla 'for' może zostać wykonana co najwyżej raz. Z pewnością pozwala na generalizację, jak w twoim przykładzie z 'deque'. – Bakuriu

Powiązane problemy