2013-08-26 51 views
5

假设我想处理文件的每一行,但最后一行需要特殊处理:在Python中,如何测试一行是否是最后一行?

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) 

的问题是,如何实现一个?似乎没有检测Python中的文件结束的功能。

是否有另一种解决方案,而不是将行读入列表(使用f.readlines()或类似的)?

+0

阅读所有与片? – 2013-08-26 17:31:41

回答

13

进程以前行:

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) 

当循环结束,你知道,最后一行刚读。

的通用版本,让你分开处理的N个最后几行,使用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我只是想提出这个建议。 – arshajii

+0

为了可读性,将'for'''else'嵌套到它的值可能值得吗? – scohe001

+0

更一般地说,您可以使用队列来实现任意大小的处理延迟。 –

3

您可以使用itertools.tee,反覆可迭代的两个副本:

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

您的最后一行处理可能更简单;只要在行中使用last_line:handle_last_line(last_line)'。 –

+0

@MartijnPieters我认为,即使它更短,它不会更具可读性。可能不是很明显,for循环最多可以执行一次。当然,它允许泛化,就像在你的例子中使用'deque'一样。 – Bakuriu

相关问题