从mongodb将json数据导出到csv

时间:2016-10-25 21:57:08

标签: python arrays mongodb csv

从mongodb将数据导出到csv时,我遇到了python脚本中缺少字段名称的问题。类型字段名称存在于第一个记录中,但它不会出现在其余记录中。如果不存在,如何编写python脚本为type字段赋予null值。

Mongodb集合的样本:

"stages": [
    {
        "interview": false,
        "hmNotification": false,
        "hmStage": false,
        "type": "new",
        "isEditable": false,
        "order": 0,
        "name": {
            "en": "New"
        },
        "stageId": "51d1a2f4c0d9887b214f3694"
    },
    {
        "interview": false,
        "hmNotification": true,
        "isEditable": true,
        "order": 1,
        "hmStage": true,
        "name": {
            "en": "Pre-Screen"
        },
        "stageId": "51f0078d7297363f62059699"
    },
    {
        "interview": false,
        "hmNotification": false,
        "hmStage": false,
        "isEditable": true,
        "order": 2,
        "name": {
            "en": "Phone Screen"
        },
        "stageId": "51d1a326c0d9887721778eae"
    }]

Python脚本示例:

import csv
cursor = db.workflows.find( {}, {'_id': 1, 'stages.interview': 1, 'stages.hmNotification': 1, 'stages.hmStage': 1, 'stages.type':1, 'stages.isEditable':1, 'stages.order':1,   
'stages.name':1, 'stages.stageId':1 })
flattened_records = []
for stages_record in cursor:
    stages_record_id = stages_record['_id']
    for stage_record in stages_record['stages']:
        flattened_record = {
            '_id': stages_record_id,
            'stages.interview': stage_record['interview'],
            'stages.hmNotification': stage_record['hmNotification'],
            'stages.hmStage': stage_record['hmStage'],
            'stages.type': stage_record['type'],  
            'stages.isEditable': stage_record['isEditable'],
            'stages.order': stage_record['order'],
            'stages.name': stage_record['name'],
            'stages.stageId': stage_record['stageId']}                   
        flattened_records.append(flattened_record)

运行python脚本时,它会显示keyerror:"键入"。请帮我如何在脚本中添加缺少的字段名称。

1 个答案:

答案 0 :(得分:0)

当您尝试获取Python字典中可能不存在的值时,可以使用.get()类的dict方法。

例如,假设你有一个这样的字典:

my_dict = {'a': 1, 
           'b': 2,
           'c': 3}

您可以使用get方法获取其中一个密钥:

>>> print(my_dict.get('a'))
1

但是,如果您尝试获取不存在的密钥(例如does_not_exist),默认情况下您将获得None

>>> print(my_dict.get("does_not_exist"))
None

如文档中所述,您还可以提供默认值,该值将在密钥不存在时返回:

>>> print(my_dict.get("does_not_exist", "default_value"))
default_value

但如果密钥确实存在于字典中,则不会使用此默认值(如果密钥确实存在,您将获得其值):

>>> print(my_dict.get("a", "default_value"))
1

知道,当您构建 flattened_record 时,您可以这样做:

'stages.hmStage': stage_record['hmStage'],
'stages.type': stage_record.get('type', ""),  
'stages.isEditable': stage_record['isEditable'],

因此,如果stage_record字典不包含密钥typeget('type')将返回一个空字符串。

你也可以尝试:

'stages.hmStage': stage_record['hmStage'],
'stages.type': stage_record.get('type'),  
'stages.isEditable': stage_record['isEditable'],
stage_record.get('type')不包含None密钥时,

然后stage_record将返回type

或者您可以设置默认"UNKNOWN"

'stages.type': stage_record.get('type', "UNKNOWN"),