Python 将字典中的几个字段解析为CSV时出错
我试图将一个非常大的字典中的几个字段解析成csv。以下是我尝试过的Python 将字典中的几个字段解析为CSV时出错,python,csv,parsing,pandas,dictionary,Python,Csv,Parsing,Pandas,Dictionary,我试图将一个非常大的字典中的几个字段解析成csv。以下是我尝试过的 b {u'message': {u'method': u'XXXX', u'params': {u'documentURL': u'xxxx', u'A': u'yyyy', u'initialPriority': u'Medium', u'method': u'GET', u'mixedContentType': u'none', u'url': u'xxxx'}, u'
b
{u'message': {u'method': u'XXXX',
u'params': {u'documentURL': u'xxxx',
u'A': u'yyyy',
u'initialPriority': u'Medium',
u'method': u'GET',
u'mixedContentType': u'none',
u'url': u'xxxx'},
u'date': u'qqqq',
u'time': u'wwww',
u'type': u'Other',
u'wallTime': u'uuuu'},
u'webview': u'0'}
这里的问题是字典的结构不正确,一些时间变量如传递(b[i]['message']['action']['output']['passed'])
不存在,因此出现了一个错误。如何使此代码仅在值存在时追加,如果值不存在,则使其为空
我只想在字段存在时进行解析,如果字段不存在,则希望将其设置为NULL。有人能帮我做这件事吗
还有更有效的解析方法吗?您可以使用
get()
而不是[]
,因为如果字典中不存在键,它将返回None
。这是假设“消息”始终存在,但其他消息可能存在,也可能不存在:
result = []
for i, val in enumerate(b):
output['a']= b[i]['message']['params']['A']
output['date'] = b[i]['message']['date']
output['time'] = b[i]['message']['time']
output['passed'] = b[i]['message']['action']['output']['passed']
result.append(output)
x = pd.DataFrame(json_normalize(result))
x.to_csv('output.csv', encoding='utf-8')
这种方法不扩展,但如果只需要从字典中获取很少的字段,那么该方法将有效。什么是b?请张贴完整的相关代码哦,对不起。b就像一本字典。这是非常大的职位。这就是为什么我没有把它放在这里。如果你愿意,我可以编辑它。你可以发布它的一部分,或者发布一个指向整个字典的链接,这样我们就知道它是什么样子以及它的结构是什么吗?对于每个可能存在或可能不存在的字段,你都需要一个if条件,检查是否存在,然后根据条件附加值或NULL。b是字典还是字典列表?[]如果字典中不存在键,也将返回None。
[]
如果键不存在,将给出一个KeyError
。只有当键存在但值为None
时,它才会返回None
。嗯,好的,是的。但仅仅使用get也会带来同样的问题,并且会引发“NoneType没有属性”异常。这取决于是否只缺少最后一个键或中间键。如果是前者,这应该是可行的。如果是后者,OP需要为每个步骤添加空检查。
result = []
for k in b:
msg=b[k]['message'] # if b is a dictionary of dictionaries
msg=k['message'] # if b is a list of dictionaries
if 'params' in msg:
if 'A' in msg['params']:
output['a']=msg['params']['A']
else:
output['a']="NULL"
else:
output['a']="NULL"
if 'date' in msg:
output['date']=msg['date']
else:
output['date']="NULL"
if 'time' in msg:
output['time']=msg['time']
else:
output['time']="NULL"
if 'action' in msg:
if 'output' in msg['action']:
if 'passed' in msg['actions']['output']:
output['passed']=msg['actions']['output']['passed']
else:
output['passed']="NULL"
else:
output['passed']="NULL"
else:
output['passed']="NULL"
result.append(output)
x = pd.DataFrame(json_normalize(result))
x.to_csv('output.csv', encoding='utf-8')