Как мне обработать ошибки индекса вне диапазона при анализе больших объемов данных в Python? - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть огромное количество данных в файле .txt, которые я пытаюсь проанализировать в objects в list, используя Pyhon.Структура данных выглядит так по большей части, и когда это происходит, анализ выполняется успешно.

2315462;3/13/2015 8:00:00 AM;3/13/2015 1:00:00 PM
778241;1/3/2015 12:30:00 PM;1/3/2015 1:00:00 PM

Как видите, есть идентификатор, время начала и время окончания.Он анализируется с использованием этого кода:

my_array_with_objects = []

with open("test.txt", newline='\n') as f:
reader = csv.reader(f, delimiter=';')

for row in reader:
    my_array_with_objects.append(Employee(row[0], row[1], row[2]))

Employee, являющийся классом, который выглядит следующим образом:

class Employee:

def __init__(self, id, time_start, time_end):
    self.id = id
    self.time_start = time_start
    self.time_end = time_end

Иногда, однако, time_end отсутствует в данных:

276908;1/3/20152015 8:00:00 AM

В этот момент программа завершает работу с исключением index out of range.Я новичок в Python, но слышал, что нет такой вещи, как null значение.Тогда почему он падает?Я предположил, что это может быть обработано чем-то вроде:

if row[2] is None:
    print("error, do things to fix")

... но это не срабатывает.Как мне справиться с этими ошибками?Я не хочу, чтобы что-то особенное произошло, если отсутствует row[2].Это нормально с пустым значением.

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Вы можете добавить чек if len(row) < 3 в соответствии с предложением @Torxed.Лучшим решением может быть переписать класс Employee и использовать оператор «splat» для расширения строки (списка).Для пропущенных значений используется пустая строка ''.

Это также охватывает случаи, когда отсутствуют как start_time, так и end_time или все 3 значения.

class Employee:
    def __init__(self, id='', start_time='', end_time=''):
        self.id = id
        self.start_time = start_time
        self.end_time = end_time

        # check values and convert to int, datetime...

for row in reader:
    my_array_with_objects.append(Employee(*row))
0 голосов
/ 27 февраля 2019

Если вы хотите покрыть отсутствующий time_end, это должно сработать:

for row in reader:
    try:
        my_array_with_objects.append(Employee(row[0], row[1], row[2]))
    except IndexError:
        my_array_with_objects.append(Employee(row[0], row[1], None))

Вы можете заменить None значением по умолчанию или выбрать способ обработки отсутствующего поля, каким хотите в блоке исключений.

...