我有一个.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]
,我不希望发生任何特殊情况。可以使用空值。
答案 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块中处理缺少的字段