3

json.load(<filehandle>)たとえば、JSON から派生したかなり複雑なデータ構造があります。

{
    "sensors": {
        "measurements": [
            [
                null, 
                null, 
                null
            ], 
            [
                {
                    "sensor": "Fields 341", 
                    "remote": null, 
                    "mark": "reliable", 
                    "duration": 81.54296875
                }, 
                {
                    "sensor": "Fields 341", 
                    "remote": null, 
                    "mark": "reliable", 
                    "duration": 61.54534875
                },
                {
                    "sensor": "Fields 341", 
                    "remote": null, 
                    "mark": "reliable", 
                    "duration": 61.89378945
                }
            ]
        ]
    }
}

結果は、ネストされた辞書とリストです。

{u'sensors': {u'measurements': [[None, None, None],
                            [{u'duration': 81.54296875,
                              u'mark': u'reliable',
                              u'remote': None,
                              u'sensor': u'Fields 341'},
                             {u'duration': 61.545348750000002,
                              u'mark': u'reliable',
                              u'remote': None,
                              u'sensor': u'Fields 341'},
                             {u'duration': 61.89378945,
                              u'mark': u'reliable',
                              u'remote': None,
                              u'sensor': u'Fields 341'}]]}}

目標は、データを取得し、sqlalchemy を介してデータベースに詰め込むことです。このような:

for item in sensors["measurements"]:
    for j in range(len(sensors["measurements"])):
        DBTable.DBField = item[j]["sensor"]
        ...

null/Noneこれの問題点は次のとおりです。測定値が誤っている場合(最初のもののように)、データ内の任意の部分が置き換えられる可能性があります。その場合、DBFields を割り当てる必要がありますNone。この場合、割り当てによって例外が発生します。

TypeError: 'NoneType' object is unsubscriptable

例外を発生させずに for ループを実行する適切な方法はありますか (おそらく .get() を使用します)。そうでない場合、この存在しないデータ構造を処理する最善の方法は何ですか?

4

2 に答える 2

3

好きなデフォルトで辞書を事前に構築できます。

defaults = {"sensor": None, "remote": None", "mark": None, "duration": None }

次に、次のことができます。

DBTable.DBField = item.get(j, defaults)["sensor"]

デフォルト項目にa を使用することもできcollections.defaultdictます。これにより、アクセスするキーのデフォルトを指定できます。

于 2012-07-30T18:53:09.080 に答える
1

これはうまくいくかもしれません

for item in sensors["measurements"]:
 for j in range(len(sensors["measurements"])):
     try:
        DBTable.DBField = item[j]["sensor"]
     except:
        DBTable.DBField = None
于 2012-07-30T19:32:59.800 に答える