Python 将字典中的几个字段解析为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'

我试图将一个非常大的字典中的几个字段解析成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'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')