在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或开始时间无关,但会工作/被此类吃掉)。你是正确的,但问题不涉及值解析,只涉及赋值。我将在脚本中添加注释行以发出警告。