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

在Python中解析大量数据时,如何处理索引超出范围的错误?,python,parsing,null,indexoutofboundsexception,Python,Parsing,Null,Indexoutofboundsexception,我有一个.txt文件中的大量数据,我正试图使用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("t

我有一个
.txt
文件中的大量数据,我正试图使用
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\u end

276908;1/3/20152015 8:00:00 AM
此时程序崩溃,索引超出范围
异常。我是Python新手,但听说没有
null
值。那它为什么会崩溃呢?我认为它可以通过以下方式处理:

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

…但它不会触发。如何处理这些错误?如果
行[2]
丢失,我不希望发生任何特殊情况。空值也可以。

如果要覆盖丢失的时间\u结束,这应该可以做到:

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,或者选择如何处理缺少的字段,但要在Exception块中进行处理

您可以按照@torx的建议,在len(row)<3
的情况下添加一个复选框。更好的解决方案可能是重写
Employee
类,并使用“splat”操作符展开行(列表)。对于缺少的值,使用空字符串“”

这也包括同时缺少开始时间和结束时间,或全部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))

if len(row)
如果缺少
时间_end
,应该这样做吗?你还应该对长度不合适的时间进行某种形式的格式检查,以防它实际上是你想保留的一行,但缺少另一个字段或其他什么。很好,工作起来很有魅力。非常感谢@Torxed。如果你想让我检查一下答案,就把它作为真实答案贴出来:)把它交给赞。他有一个正确的观点,建议的解决方案非常巧妙地扩展了我的想法:)巧妙地使用列表扩展和默认值来解决这个问题。做得好:)请注意,这可能会捕获容易出错的行,其中
id
start\u time
中的数据可能会变成不正确的值。它将允许“吃掉”这些行,只是数据可能不正确。这仍然是一个很好的解决方案,但是为这些问题做标记或以后处理它们变得很重要:)@tored谢谢!此解决方案避免了任何错误检查。所有内容都是字符串,因此此时没有不正确的值,只有缺少的值。我假设作者稍后在将值转换为int和datetime时进行错误检查。只是为了澄清一个关于错误值的示例:(这会给人错误的感觉,认为一切都在工作,但这些值与ID或开始时间无关,但会工作/被此类吃掉)。你是正确的,但问题不涉及值解析,只涉及赋值。我将在脚本中添加注释行以发出警告。