2012-07-06 41 views
5

我需要逐行阅读文件,我需要偷看到'下一行',所以首先我将文件读入列表中,然后循环遍历列表...不知何故,这似乎粗鲁,建立清单可能会变得昂贵。文件访问偷看前面

for line in open(filename, 'r'): 
    lines.append(line[:-1]) 

for cn in range(0, len(lines)): 
    line = lines[cn] 
    nextline = lines[cn+1] # actual code checks for this eof overflow 

必须有一个更好的办法来遍历行,但我不知道该怎么偷看提前

+2

为什么你需要提前偷看?从代码中不清楚“窥视未来”发生的位置以及您如何使用它。 – unwind 2012-07-06 09:03:16

+2

我把这个窥视先行一步掉出来了,这对于前面的问题 – Paul 2012-07-06 09:09:40

回答

6

你可能会寻找做像itertools的pairwise配方。

from itertools import tee, izip 
def pairwise(iterable): 
    "s -> (s0,s1), (s1,s2), (s2, s3), ..." 
    a, b = tee(iterable) 
    next(b, None) 
    return izip(a, b) 

with open(filename) as f: # Remember to use a with block so the file is safely closed after 
    for line, next_line in pairwise(f): 
     # do stuff 
+1

来说太大了,而且没有明确说明这对我来说真的很不错,但是如果我站在脚趾上,我可以轻易触摸它,thanx! – Paul 2012-07-06 09:29:43

+0

oke,更好地掌握itertools,但是...未能掌握next(b,None)的确切含义... – Paul 2012-07-06 10:15:14

+1

@Paul它将迭代器b向前推进一个元素。如果迭代器中没有剩余元素,则会触发'StopIteration'。 'next'接受它返回的默认参数,如果发生的话,而不是引发错误。 'None'只是用作占位符,因为如果我们已经达到了迭代的结尾,我们将不会真正使用该值。 – jamylak 2012-07-06 10:20:01

1

你可以这样

last_line = None 

for line in open(filename):                 
    if last_line is not None: 
     do_stuff(last_line, line) 
    last_line = line               
0

您可以创建一个iterator,做这样的:

f = open(filename, 'r') 
g = open(filename, 'r') 

y = iter(g.readlines()) 
y.__next__() 

for line in f: 
    print(line) 
    try: 
     print(y.__next__()) 
    except StopIteration: 
     f.close() 
     g.close() 
+0

'g'已经是文件行的迭代器,所以不需要'y'。另外我假设你使用python 3,因为你调用了'__next__',如果你真的需要的话,你应该使用'next(y)'。我不认为这是一个好主意,无论如何打开同一个文件两次,我的解决方案使用'tee'来做到这一点。您还应该关闭这些文件或使用'with'块。 – jamylak 2012-07-06 09:51:43

+0

'next(y)'在python 3中不起作用,而g是一个'TextIOWrapper'对象。所以,即使它是一个可迭代的对象,它也没有'next()'方法。是的,打开同一文件两次可能不是一个好主意,但它只能在读取模式下使用,所以不要认为它会造成很大的伤害。 – Vizard 2012-07-06 10:11:30

+0

是的,使用'tee'可能是一种更好的方法,但试图尽可能简单。 – Vizard 2012-07-06 10:13:26