2013-08-26 42 views
5

Giả sử tôi muốn để xử lý mỗi dòng của một tập tin, nhưng dòng cuối cùng cần điều trị đặc biệt:Trong Python, làm thế nào để kiểm tra xem một dòng là cuối cùng?

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) 

Câu hỏi đặt ra là, làm thế nào để thực hiện? Dường như không có chức năng nào để phát hiện kết thúc tệp trong Python.

Có giải pháp nào khác ngoài việc đọc các dòng vào danh sách (với f.readlines() hoặc tương tự) không?

+0

đọc tất cả và lát? –

Trả lời

13

Process dòng trước:

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) 

Khi vòng lặp kết thúc, bạn biết rằng dòng cuối cùng đã được chỉ đọc.

Một phiên bản generic, cho phép bạn xử lý N dòng cuối cùng riêng biệt, sử dụng một 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 Tôi vừa đề xuất điều này. – arshajii

+0

Có thể coi trọng việc lồng vào '' của 'khác' để dễ đọc không? – scohe001

+0

Nói chung, bạn có thể sử dụng hàng đợi để thực hiện trễ xử lý ở mọi kích thước. –

3

Bạn có thể sử dụng itertools.tee để lặp trên hai bản sao của một 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

Việc xử lý dòng cuối cùng của bạn có thể đơn giản hơn; chỉ làm 'cho last_line trong dòng: handle_last_line (last_line)'. –

+0

@MartijnPieters Tôi cho rằng, mặc dù ngắn hơn nhưng nó không dễ đọc hơn. Có thể không rõ ràng rằng vòng lặp 'for' có thể được thực thi nhiều nhất một lần. Chắc chắn nó cho phép khái quát hóa như trong ví dụ của bạn với 'deque'. – Bakuriu

Các vấn đề liên quan