我正在处理使用字典的数据集。不能保证数据集的每一部分都符合要求。有时我会收到密钥错误或与密钥无关。我想不出的是如何处理这个问题。因为我经常遇到这种情况。它让我在每一行或每一步都进行防守性编程。所以我想知道的是如何从结构和逻辑上处理?让我困惑的是。我应该使用字典默认键吗?如果没有值,那么默认为假真值,然后是if-truth-value语句。这似乎非常庞大,而且在每种情况下都要做大量的工作?以下是使用我的数据结构的情况示例。
错误项目-没有结束时间键,没有名称
job = {'name':'', 'starttime':, 'definition': [long list of stuff]}
好的项目
job = {'name':'name', 'starttime':5.5, 'endtime':6.5 'definition':
[long list of stuff]}
for job in batch:
job_name = job.get('name', 'Error: No job name found!')
start_time = float(job.get('starttime', 0.0))
if start_time:
current_runtime = time.time() - start_time
end_time = float(job.get('endtime', 0.0))
job_definition = job.get('definition', 'Error: No definition found!')
parse_jobdef = parse_job_definition(job_definition)
job_depends = parse_jobdef.get('depends', 'Error: No depends found!')
average_runtime = get_average_runtime(job_name)
所以如果没有名字。。。然后我的程序崩溃了。如果不是starttime,它可能会崩溃。如果这是在迭代中,并不意味着整个程序应该崩溃,而只是在项目上是糟糕的。我想继续下一次迭代。
这更多是一个概括的问题,而不是具体的情况。
在迭代中处理数据结构时,如何处理坏数据?所以缺少键和空值。我应该在整个代码中处理catching或if语句吗。这是唯一的办法吗?
为什么不这样做:
def has_keys(_dict, keys):
for _key in keys:
if not _dict.has_key(_key):
logging.debug('{0} has no key {1}'.format(_dict, _key))
return False
return True
def your_function_where_you_do_stuff():
...
_keys = ['name', 'starttime', 'endtime', 'definition', 'depends']
for job in batch:
if not has_keys(job, _keys):
continue
job_name = job[name]
...
您很可能需要单独检查每个键的一致性才能真正解决问题。您可以压缩其中的一些,比如检查键列表是否存在并且不为空,或者是否大于零。但是,根据您需要的彻底程度,您可能需要检查特定键的值是否在一个范围内,或者根据一些标准是否有效。无论你做什么,用0之类的东西替换无效值都需要非常小心。很可能你只是破坏了你的数据,并说服程序的其他部分相信这个数据集是有效的,而实际上它只是随机的默认值。如果你发现不一致,你可能应该跳过该记录,使用continue
继续。为了防止不必要的膨胀,你可以将for循环中的所有内容都封装在try
块中,这样就不必显式检查键是否存在。
try:
for need_not_empty_key in ["name", "start_time"]:
if not job[need_not_empty_key]:
#A required key is empty
#Log the problem
continue
#Verify something about a specific key
job_name = job["name"]
if len(job_name) < 4:
#Name is less than 4, it must be bad
#Log the problem!
continue
#Rest of work here
#Save results of this iteration here
except KeyError:
#We must not have a needed key
#Do some logging here instead of passing!
pass
我该怎么做:
keys=('name','starttime','endtime','define')
对于批处理中的作业:temp=dict.fromkeys(键)临时更新(作业)
这样,您将始终拥有所需的所有密钥,缺少的密钥将具有None值。
http://www.tutorialspoint.com/python/dictionary_fromkeys.htm
(对不起,我在打电话)