2012-11-23 19 views
8

Hier zu erstellen sind meine Daten von Google BigQuery zu analysieren:Parsing Daten ein json Datenobjekt mit Python

{ 
    u'kind': u'bigquery#queryResponse', 
    u'rows': [ 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'995' 
       }, 
       { 
        u'v': u'1600' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'942' 
       }, 
       { 
        u'v': u'1607' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'937' 
       }, 
       { 
        u'v': u'1599' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'894' 
       }, 
       { 
        u'v': u'1598' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'848' 
       }, 
       { 
        u'v': u'1592' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'841' 
       }, 
       { 
        u'v': u'1590' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'786' 
       }, 
       { 
        u'v': u'1603' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'779' 
       }, 
       { 
        u'v': u'1609' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'762' 
       }, 
       { 
        u'v': u'1597' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'753' 
       }, 
       { 
        u'v': u'1594' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'740' 
       }, 
       { 
        u'v': u'1596' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'738' 
       }, 
       { 
        u'v': u'1612' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'718' 
       }, 
       { 
        u'v': u'1590' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'717' 
       }, 
       { 
        u'v': u'1610' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'715' 
       }, 
       { 
        u'v': u'1602' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'680' 
       }, 
       { 
        u'v': u'1606' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'674' 
       }, 
       { 
        u'v': u'1603' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'639' 
       }, 
       { 
        u'v': u'1603' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'637' 
       }, 
       { 
        u'v': u'1603' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'634' 
       }, 
       { 
        u'v': u'1590' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'633' 
       }, 
       { 
        u'v': u'1599' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'616' 
       }, 
       { 
        u'v': u'1596' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'614' 
       }, 
       { 
        u'v': u'1596' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'612' 
       }, 
       { 
        u'v': u'1595' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'607' 
       }, 
       { 
        u'v': u'1603' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'579' 
       }, 
       { 
        u'v': u'1593' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'570' 
       }, 
       { 
        u'v': u'1600' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'541' 
       }, 
       { 
        u'v': u'1599' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'525' 
       }, 
       { 
        u'v': u'1608' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'520' 
       }, 
       { 
        u'v': u'1599' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'518' 
       }, 
       { 
        u'v': u'1602' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'486' 
       }, 
       { 
        u'v': u'1595' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'470' 
       }, 
       { 
        u'v': u'1593' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'433' 
       }, 
       { 
        u'v': u'1609' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'429' 
       }, 
       { 
        u'v': u'1607' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'421' 
       }, 
       { 
        u'v': u'1611' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'399' 
       }, 
       { 
        u'v': u'1592' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'363' 
       }, 
       { 
        u'v': u'0' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'353' 
       }, 
       { 
        u'v': u'1594' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'287' 
       }, 
       { 
        u'v': u'1609' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'106' 
       }, 
       { 
        u'v': u'0' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'57' 
       }, 
       { 
        u'v': u'1609' 
       } 
      ] 
     } 
    ], 
    u'jobReference': { 
     u'projectId': u'670640819051', 
     u'jobId': u'job_5bf745fcee8b470e997d8ea90f380e68' 
    }, 
    u'jobComplete': True, 
    u'totalRows': u'42', 
    u'schema': { 
     u'fields': [ 
      { 
       u'type': u'STRING', 
       u'name': u'word', 
       u'mode': u'NULLABLE' 
      }, 
      { 
       u'type': u'INTEGER', 
       u'name': u'word_count', 
       u'mode': u'NULLABLE' 
      }, 
      { 
       u'type': u'INTEGER', 
       u'name': u'corpus_date', 
       u'mode': u'NULLABLE' 
      } 
     ] 
    } 
} 

Als Python newbee, ich habe wirklich keine Ahnung, wie etwa das Parsen diese Daten gehen zu erstellen ein JSON-Objekt wie unten:

[ 
    {'count': 200, 'year': 2008}, 
    {'count': 240, 'year': 2010}, 
    {'count': 290, 'year': 2009} 
] 

Kann mir irgendjemand einen Hinweis geben, wie ich anfangen soll?

Beispiel

[{u'v': u'the'}, {u'v': u'995'}, {u'v': u'1600'}] 

In dieser für das Wort 'the', count ist 995 und year ist 1600. Und so folgt.

+1

hallo, Wo "Jahr" und "count" kommt? – andrefsp

+0

Ich habe gerade aktualisiert – iJade

+0

In Ihrem Beispiel, wie unterscheiden Sie, dass {u'v ': u'995'} 'steht für" count "und' {u'v ': u'1600'} 'steht für' Jahr? –

Antwort

27

Wenn 'Z' Ihr großes Wörterbuch ist, erhalten Sie bei 'Antwort' die Struktur, die Sie brauchen.

import json 

response = [] 
for row in z['rows']: 
    for key, dict_list in row.iteritems(): 
     count = dict_list[1] 
     year = dict_list[2] 
     response.append({'count': count['v'], 'year' : year['v']}) 

print json.dumps(response) 

Auf Antwort erhalten Sie folgende erhalten:

[{'count': u'995', 'year': u'1600'}, 
{'count': u'942', 'year': u'1607'}, 
{'count': u'937', 'year': u'1599'}, 
{'count': u'894', 'year': u'1598'}, 
{'count': u'848', 'year': u'1592'}, 
{'count': u'841', 'year': u'1590'}, 
{'count': u'786', 'year': u'1603'}, 
{'count': u'779', 'year': u'1609'}, 
{'count': u'762', 'year': u'1597'}, 
{'count': u'753', 'year': u'1594'}, 
{'count': u'740', 'year': u'1596'}, 
{'count': u'738', 'year': u'1612'}, 
{'count': u'718', 'year': u'1590'}, 
{'count': u'717', 'year': u'1610'}, 
{'count': u'715', 'year': u'1602'}, 
{'count': u'680', 'year': u'1606'}, 
{'count': u'674', 'year': u'1603'}, 
{'count': u'639', 'year': u'1603'}, 
{'count': u'637', 'year': u'1603'}, 
{'count': u'634', 'year': u'1590'}, 
{'count': u'633', 'year': u'1599'}, 
{'count': u'616', 'year': u'1596'}, 
{'count': u'614', 'year': u'1596'}, 
{'count': u'612', 'year': u'1595'}, 
{'count': u'607', 'year': u'1603'}, 
{'count': u'579', 'year': u'1593'}, 
{'count': u'570', 'year': u'1600'}, 
{'count': u'541', 'year': u'1599'}, 
{'count': u'525', 'year': u'1608'}, 
{'count': u'520', 'year': u'1599'}, 
{'count': u'518', 'year': u'1602'}, 
{'count': u'486', 'year': u'1595'}, 
{'count': u'470', 'year': u'1593'}, 
{'count': u'433', 'year': u'1609'}, 
{'count': u'429', 'year': u'1607'}, 
{'count': u'421', 'year': u'1611'}, 
{'count': u'399', 'year': u'1592'}, 
{'count': u'363', 'year': u'0'}, 
{'count': u'353', 'year': u'1594'}, 
{'count': u'287', 'year': u'1609'}, 
{'count': u'106', 'year': u'0'}, 
{'count': u'57', 'year': u'1609'}] 

ich seine glauben, was Sie brauchen. Dann nur json verwenden und eine auf die Antwort tun, und das ist es.

+1

Es gibt einen Tippfehler respone = [] sollte Antwort = [] sein –

+1

@KG Danke. Ich korrigierte. – andrefsp

4

Mit dem Modul json können Sie einfach Python-Objekte in JSON-Objekte konvertieren und umgekehrt. Foundational gibt es nur 2 Klassen: JSONEncoder und JSONDecoder: die erste wandelt Python-Sammlungen in JSON-Strings, die zweite eine JSON-Zeichenfolge in ein Python-Objekt.

Beispiele:

from json import JSONEncoder 

jsonString = JSONEncoder().encode({ 
    "count": 222, 
    "year": 2012 
}) 

der Code über einen JSON-String aus einem Python-Wörterbuch erzeugt

from json import JSONDecoder 

pyDictionary = JSONDecoder().decode('{"count": 222, "year": 2012}') 

der obigen Code wird

0

Version einen Python-Wörterbuch aus einem JSON-String erzeugt 0.28.0 und später von google-cloud-bigquery library verwenden Sie eine Klasse, um Zeilen aus einer Tabelle oder Abfrage zu analysieren.

Zum Beispiel mit einem Schema der Ergebnisse einer Abfrage drucken

[ 
    { 
     u'type': u'STRING', 
     u'name': u'word', 
     u'mode': u'NULLABLE' 
    }, 
    { 
     u'type': u'INTEGER', 
     u'name': u'word_count', 
     u'mode': u'NULLABLE' 
    }, 
    { 
     u'type': u'INTEGER', 
     u'name': u'corpus_date', 
     u'mode': u'NULLABLE' 
    }, 
] 

wie in Ihrem Beispiel ein

query = client.query('...') 
rows = query.result() 
for row in rows: 
    # Access by column index. 
    print('word: {}'.format(row[0])) 
    # Access by column name. 
    # The library parses the result into an integer object, 
    # based on the schema. 
    print('word_count: {}'.format(row['word_count'])) 
    # Access by column name, like an attribute. 
    print('corpus_date: {}'.format(row.corpus_date)) 

In Version 0.29.0 (noch nicht freigegeben, wie die 2017- tun könnten 12-04), gibt es Methoden für keys(), values(), items() und get(), genau wie ein integriertes Dictionary-Objekt. (Hinzugefügt in PR #4393) So konvertieren Zeilen in einem JSON-like Wörterbuch in 0.29.0:

query = client.query('...') 
rows = query.result() 
for row in rows: 
    row_json = dict(row.items())