在python

时间:2015-08-03 16:13:37

标签: python file loops

我正在读取文件的每一行并对其执行一些操作。有时,程序会因网络中的某些奇怪行为而抛出错误(它会通过SSH连接到远程计算机)。偶尔会发生这种情况。我想捕获此错误并在同一行上再次执行相同的操作。具体来说,我想再次读同一行。我正在寻找这样的东西。

with open (file_name) as f:  
    for line in f:  
        try:    
            do this  
        except IndexError:  
            go back and read the same line again from the file.  

3 个答案:

答案 0 :(得分:4)

只要您处于for循环的块内,您仍然可以访问该行(除非您当然明知地修改了它)。所以你实际上并不需要从文件重新读取它,但你仍然将它留在内存中。

例如,您可以尝试反复“执行此操作”,直到成功为止:

for line in f:
    while True:
        try:
            print(line)
            doThis()
        except IndexError:
            # we got an error, so let’s rerun this inner while loop
            pass
        else:
            # if we don’t get an error, abort the inner while loop
            # to get to the next line
            break

答案 1 :(得分:1)

您不需要重新阅读该行。线变量保持你的线。您要做的是在失败时重试您的操作。一种方法是使用函数,并在函数失败时从函数中调用函数。

def do(line):
    try:
        pass # your "do this" code here
    except IndexError:
        do(line)

with open (file_name) as f:  
    for line in f:  
        do(line) 

答案 2 :(得分:1)

Python没有'repeat'关键字将执行指针重置为当前迭代的开头。您最好的方法可能是再次查看代码的结构,并将“执行此操作”分解为重试的函数,直到完成为止。

但是如果你真的设置了尽可能接近地模拟repeat关键字,我们可以通过将文件对象包装在生成器中来实现它

不是直接在文件上循环,而是使用重复选项一次一行地定义一个生成器来自文件的产生。

def repeating_generator(iterator_in):
    for x in iterator_in:
        repeat = True
        while repeat:
            repeat = yield x
            yield

您的文件对象可以使用此生成器进行包装。我们将一个标志传回发生器,告诉它是重复上一行,还是继续下一行......

with open (file_name) as f:
    r = repeating_generator(f)  
    for line in r:  
        try:    
            #do this
            r.send(False) # Don't repeat
        except IndexError:  
            r.send(True) #go back and read the same line again from the file.  

看看this question,看看这里发生了什么。我不认为这是最可读的方式,首先考虑替代方案!请注意,您需要Python 2.7或更高版本才能使用它。