Python 发生错误时重新启动脚本,并继续使用csv文件中的右行

Python 发生错误时重新启动脚本,并继续使用csv文件中的右行,python,selenium,Python,Selenium,嗨,伙计们,这是我第一次在这里寻求帮助,希望你们能帮助我 我有我写的代码 def my_function(): try : with open('file.csv', 'r') as f: data = list(csv.reader(f, delimiter=',')) i = 1 while i <= 10: i += 1 fname = data[i][0]

嗨,伙计们,这是我第一次在这里寻求帮助,希望你们能帮助我 我有我写的代码

def my_function():
try :
    with open('file.csv', 'r') as f:
        data = list(csv.reader(f, delimiter=','))

        i = 1
        while i <= 10:
            i += 1
            fname = data[i][0]
            lname = data[i][1]

            options = Options()
            driver = webdriver.Chrome(options=options)
            driver.get("https://www.test.net/")


            #Do staff


except Exception as e:
    print(e)
    driver.quit()
    time.sleep(1)
    print('******RESTART******')
    my_function()


my_function()
def my_函数():
尝试:
将open('file.csv','r')作为f:
数据=列表(csv.reader(f,分隔符=','))
i=1

当i时,您可以将
i
设置为默认值为
1
的关键字参数,然后在每次异常时,在重新启动函数时传递当前的
i
,以便它从那里拾取

这是一个简化的示例,我建议您遵循您在问题中使用的相同一般方法(但使用假数据,这样我就可以在没有CSV文件的情况下运行它)

def my_函数(i=1):
尝试:
如果i==4:#防止永远递归
回来
其他:
打印(i)#跟踪循环
i+=1
x=int('te')#导致错误
除值错误外:
我的_功能(i)#将当前i发送回
我的_函数(i=0)

感谢您的快速回复。。我尝试了–Kevin Welch和–Selcuk提供的解决方案,它对我很好thx 这是解决办法

def my_function():
try :
    with open('file.csv', 'r') as f:
        data = list(csv.reader(f, delimiter=','))

        i = 1
        while i <= 10:
            i += 1
            try :

                fname = data[i][0]
                lname = data[i][1]

                options = Options()
                driver = webdriver.Chrome(options=options)
                driver.get("https://www.test.net/")

                # Do staff

            except Exception as e:
            print(e)
            driver.quit()
            time.sleep(1)
            print('******RESTAR******')
            continue

my_function()
def my_函数():
尝试:
将open('file.csv','r')作为f:
数据=列表(csv.reader(f,分隔符=','))
i=1

而我您的代码使这比它需要的困难得多

首先,几乎可以肯定的是,您不希望将整个代码块包装在“catch all”异常处理程序中。您希望异常处理足够具体(有限),以便可以对异常执行有意义的操作。例如:

#!python
# Assumes Python version 3 or later
import sys, csv

filename='myfile.csv'
with open(filename as f:
    try:
        reader = csv.reader(f)
    for record in reader:
        if len(record) != 2:
            # log error and continue
            print('Malformed records in {}: {}'.format(filename, reader.line_num), file=sys.stderr)
            continue
         # do stuff with this record, knowing it has exactly two fields:
         fname = record[0]
         lname = record[1]
         # etc ...
    except csv.Error as e:
        print('Error handling {} at line {}: {}'.format(filename, reader.line_num, e), file=sys.stderr)
请注意,您的错误可能不在
csv
模块中。它对格式不正确的线条非常宽容。但是我展示了如何在异常处理中包装阅读器和处理代码。您的错误可能是一个
索引器错误
(试图访问超过列表中项数的项…超出其有效索引范围。最好只检查每条记录的长度,而不是对此使用异常处理…尽管这两种方法都有可能

标准库的文档中有一个非常合理的示例(非常类似的代码):


另外,在风格上,我建议使用命名的元组或轻量级类(使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
)来管理这些记录。这将允许您使用点表示法来访问每个记录的
.fname
.lname
,而不是使用
[x]
和数字索引。(随着代码复杂性的增加,数字索引越来越麻烦,也越来越容易出错).

我不太明白您的意思,但如果我不得不猜测,如果抛出错误,您希望继续循环,而不是重新启动整个函数。为什么不将try/except放在while循环中?您应该在
while
循环中捕获异常,然后
continue
,而不是ca再次调用该函数。如果您像当前一样不断递归,将导致堆栈溢出。我将尝试植入此解决方案。感谢您的贡献,请单击答案旁边的复选标记,如果它回答了您的问题,请进行投票。如果您在实现该解决方案时需要更多帮助,请在此处进行评论。