2016-10-25 18 views
1

mongodbからcsvにデータをエクスポートすると、pythonスクリプトでフィールド名が見つからないという問題があります。型フィールド名は最初のレコードに存在しますが、残りのレコードには表示されません。存在しない場合は、型フィールドにnull値を与えるPythonスクリプトを書く方法。jsonデータをmongodbからcsvにエクスポート

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スクリプトのサンプル: "タイプ":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) 

、それはKeyError例外を示しています。スクリプトに不足しているフィールド名を追加する方法を教えてください。

答えて

0

Python辞書に存在しない値を取得しようとするときは、dictクラスの.get()メソッドを使用できます。例えば

、あなたは、このような辞書を持っているとしましょう:

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

あなたが存在するキーのいずれかを取得するためにgetメソッドを使用することができます。

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

しかし、あなたがしようとした場合存在しないキーを取得すると(does_not_exist)、デフォルトでが返されます。

>>> 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構築する際に、知っていること210
'stages.hmStage': stage_record['hmStage'], 
'stages.type': stage_record.get('type', ""), 
'stages.isEditable': stage_record['isEditable'], 

したがって、stage_record辞書にはキーtypeが含まれていない場合、get('type')は空の文字列を返します。

また、単にで試すことができます。そのstage_recordtypeキーが含まれていない場合に

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

、その後stage_record.get('type')Noneを返します。

またはデフォルト"UNKNOWN"

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

作ることができる」stages.typ追加したときには非常によく働いた。:Pythonスクリプトで 『stage_record.get(』タイプ ')型の値は、CSVファイルに表示されます。大変ありがとうございます。 – user7070824

+0

あなたの助けてくれてありがとう。どのように私は、文字、括弧、およびサブフィールドの名前をPythonで削除するのですか?ありがとう。 – user7070824

関連する問題