При возникновении ошибки перезапустите скрипт и продолжайте с правой строки в CSV-файле. - PullRequest
0 голосов
/ 27 сентября 2019

Привет, ребята, это мой первый раз, чтобы попросить помощи здесь, я надеюсь, что вы можете помочь мне, у меня есть этот код, который я пишу

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()

хорошо, я пытаюсь заставить этот скрипт работать без остановки ..проблема, с которой я сталкиваюсь, заключается в том, что когда он останавливается, например, в строке номер 8 (i = 8) и перезапускается снова, он начинается с первой строки (i = 1).Я хочу, чтобы скрипт перезапустился со строки 8 и продолжился до 9, 10 ...

. Можете ли вы привести меня к правильному решению .. спасибо

Ответы [ 3 ]

0 голосов
/ 27 сентября 2019

спасибо за ваш быстрый ответ .. Я попробовал решение, предоставленное –Kevin Welch и –Selcuk, оно отлично работает для меня, но вот решение

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()
0 голосов
/ 27 сентября 2019

Ваш код делает это намного сложнее, чем нужно.

Во-первых, вы почти наверняка не хотите заключать весь этот блок кода в обработчик исключений 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.Это довольно терпимо к искаженным линиям.Но я показываю, как обернуть читателя и обработать код в обработке исключений только для этого.Ваша ошибка, вероятно, была IndexError (при попытке получить доступ к элементу после количества элементов в списке ... вне его допустимого диапазона индексации. Лучше просто проверить длину каждой записи, чемиспользуйте для этого обработку исключений ... хотя это возможно в любом случае.

В документации для стандартных библиотек есть довольно разумный пример (очень похожий код): https://docs.python.org/3/library/csv.html

Кроме того, стилистическиЯ бы предложил именованный кортеж или облегченный класс (использующий __slots__) для управления этими записями. Это позволит вам использовать точечную запись для доступа к .fname и .lname каждой записи вместо использования [x]и числовое индексирование. (Числовое индексирование становится все более громоздким и подверженным ошибкам по мере увеличения сложности кода).

0 голосов
/ 27 сентября 2019

Вы можете установить i в качестве аргумента ключевого слова со значением по умолчанию 1, а затем при каждом исключении передавать текущий i при перезапуске своей функции, чтобы она оттуда получала.

ЭтоЭто упрощенный пример того, что я рекомендую, следуя тому же общему методу, который вы используете в своем вопросе (но с поддельными данными, чтобы я мог запустить его без вашего CSV-файла).

def my_function(i=1):
    try:
        if i == 4:  # to prevent forever recursion
            return
        else:
            print(i)  # keep track of loops
            i += 1
            x = int('te')   # causes an error
    except ValueError:
        my_function(i)   # send current i back through

my_function(i=0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...