我正在读取文件的每一行并对其执行一些操作。有时,程序会因网络中的某些奇怪行为而抛出错误(它会通过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.
答案 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或更高版本才能使用它。