文件迭代,检查行存在

时间:2012-02-07 23:49:38

标签: python file iteration

我正在使用像这样的for循环读取文件...

f = open("somefile.txt")

for line in f:
    do stuff

除了我读过的每一行,我需要从它前面的行中取一个项目并将它放在当前行中。做这个的最好方式是什么?有没有办法阅读下一行或从中获取一些项目而不阅读它?

4 个答案:

答案 0 :(得分:7)

如果我的理解是正确的,并且您希望依次使用下一行中的某些值来处理每一行,我的建议只是存储您当前正在阅读的值,并处理最后一个值。反向工作 - last_line是您当前的行,行是下一行。

last_line = None

with open("somefile.txt") as f:
    for line in f:
        if not last_line == None:
            do_stuff(last_line, extract_needed_part(line))
        last_line = line
do_stuff(last_line) #The final line without anything following it.

在数学术语中,不是行n和行n + 1,而是行n-1和行n。同样的效果。

这种方法的优点是它并不意味着在开始时加载整个文件。

答案 1 :(得分:3)

如果您的文件不是很大,您可以将其读入内存并在那里使用:

f = open("somefile.txt")
lines = f.readlines()
f.close()

for index, value in enumerate(lines):
    # Check if next line exists
    if index + 1 > len(lines):
        next_line = lines(index + 1)
        # do something with line and next_line

修改

对于大型文件,最简单的方法就是记住上一行:

f = open("somefile.txt")
previous_line = f.readline()
for line in f:
    # Do something with line and previous_line
    print(line, previous_line)
    # Save this line for the next iteration
    previous_line = line

可能存在边缘情况,具体取决于数据的外观。您的线路是否成对成对,或者在某些情况下您只需要从下一行获得一些信息。

例如,如果您的文件只有一行,则此代码将不执行任何操作。

答案 2 :(得分:0)

如果您的文件适合内存,您可以尝试这样的事情:

f = open('somefile.txt')
lines = f.read().splitlines()

for current_line, next_line in zip(lines, lines[1:]):
    print current_line
    print next_line
    print '-------'

上面的代码基本上读取所有行,并使用zip创建包含当前行和下一行的元组列表。

编辑:或者,对于长文件,您可以使用itertools库,如下所示:

import itertools
f = open('somefile.txt')
i1, i2 = itertools.tee(f)
lines = itertools.izip(i1, itertools.islice(i2, 1, None))
for current_line, next_line in lines:
    print current_line
    print next_line
    print '-------'

在这种情况下:

  • itertools.tee用于创建两个使用原始文件迭代器的独立迭代器(一个用于当前行,一个用于下一行)。
  • itertools.slice用于启动第二行中的下一行迭代器。
  • itertools.izip用于在元组中逐行连接两个迭代器的结果。

编辑2:根据@eyquem的建议,您也可以打开文件两次:

import itertools
f = open('somefile.txt')
g = open('somefile.txt')
lines = itertools.izip(f, itertools.islice(g, 1, None))
for current_line, next_line in lines:
    print current_line
    print next_line
    print '-------'

答案 3 :(得分:0)

with open('somefile.txt') as f, open('somefile.txt') as g:
    g.readline()
    lines = ( (f.readline(),line) for line in g)
        for precline,aheadline in lines:
            # do what you want