在Python中解析大量数据时,如何处理索引超出范围的错误?

时间:2019-02-26 22:06:16

标签: python parsing null indexoutofboundsexception

我有一个.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

如您所见,有一个ID,一个开始时间和一个结束时间。使用以下代码进行解析:

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 :(得分:1)

您可以按照@Torxed的建议添加支票if len(row) < 3。更好的解决方案可能是重写Employee类并使用'splat'运算符扩展行(列表)。对于缺少的值,使用空字符串“”。

这还涵盖了start_time和end_time或全部三个值都缺失的情况。

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

答案 1 :(得分:0)

如果您想弥补缺失的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替换为默认值,也可以选择如何在except块中处理缺少的字段