2017-03-15 6 views
1

Ich habe Probleme beim Ziehen von Daten von Json API. Ich versuche "Total_allele_count" zu erhalten. Ich bin in der Lage, andere Daten von der API zu ziehen, aber wenn es zu "exac" Daten kommt, funktioniert es nicht.Json API Datenextraktion

"alterations" : [ 
     { 
     "Gene_position" : "3164,,,", 
     "exac" : { 
      "close_matches" : [], 
      "exact_matches" : [ 
       { 
        "exac_allele" : [ 
        { 
         "West_allele_count" : 0, 
         "Total_allele_count" : "52413,1", 
         "Male_allele_count" : "11142,0" 

Hier ist, wo es versagt. Bin ich über etwas schauen?

row = alter(data, 'exac', 'Total_allele_count', row) 

meine Methode

def alter(source, org, allele, fileRow): 
    try: 
     toAppend = [int(x) for x in source['alterations'][0][org]['exact_matches'][0][allele].split('/')] 
     #fileRow.append(str(len(toAppend))) 
     fileRow.append(toAppend[1]/sum(toAppend)) 
    except: 
     fileRow.append('N/A') 
    return fileRow  
+0

Ihre json unvollständig ist. –

+1

"nicht funktioniert" ist nicht gut genug definiert, um eine Analyse bereitzustellen. Wenn du sagst "Hier ist, wo es versagt" .. bist du sicher? Woher weißt du das? Ich vermute, dass das bloße 'except:' etwas interessantes Traceback versteckt, das verwendet werden könnte, um herauszufinden, was falsch ist ... – thebjorn

Antwort

0

Der Trick besteht darin, eine Nachschlagefunktion zu schreiben, die Fehlerberichte erstellt, so dass Sie wissen, dass Sie kein Level verpasst haben. Etwas wie:

def lookup(json, *path): 
    if not path: 
     return json 

    first = path[0] 
    rest = path[1:] 

    try: 
     sub_json = json[first] 
    except (TypeError, LookupError) as e: 
     raise ValueError("Failed to look up %r in %s" % (first, json)) 
    return lookup(sub_json, *rest) 

dann können Sie implementieren Ihre alter als:

def alter(source, org, allele, fileRow): 
    value = lookup(source, 'alterations', 0, org, 'exact_matches', 0, allele) 
    try: 
     toAppend = value.split('/') 
     fileRow.append(toAppend[1]/sum(toAppend)) 
    except: 
     fileRow.append('N/A') 
    return fileRow  

mit dem oben, und schließen Sie Ihre Daten:

data = { "alterations" : [ 
     { 
     "Gene_position" : "3164,,,", 
     "exac" : { 
      "close_matches" : [], 
      "exact_matches" : [ 
       { 
        "exac_allele" : [ 
        { 
         "West_allele_count" : 0, 
         "Total_allele_count" : "52413,1", 
         "Male_allele_count" : "11142,0" 
         }]}]}}]} 

können wir alter nennen:

alter(data, 'exac', 'Total_allele_count', '') 

und erhält die folgenden Zurückverfolgungs:

Traceback (most recent call last): 
    File "<stdin>", line 35, in <module> 
    File "<stdin>", line 32, in alter 
    File "<stdin>", line 27, in lookup 
    File "<stdin>", line 27, in lookup 
    File "<stdin>", line 27, in lookup 
    File "<stdin>", line 27, in lookup 
    File "<stdin>", line 27, in lookup 
    File "<stdin>", line 26, in lookup 
ValueError: Failed to look up 'Total_allele_count' in {'exac_allele': [{'Total_allele_count': '52413,1', 'Male_allele_count': '11142,0', 'West_allele_count': 0}]} 

, die uns, dass

lookup(source, 'alterations', 0, org, 'exact_matches', 0, allele) 

fehlt ein Niveau, vor dem letzten erzählt, und es sollte sein:

lookup(source, 'alterations', 0, org, 'exact_matches', 0, 'exac_allele', allele) 

dass Laufen, wir erhalten folgende Ausnahme:

ValueError: Failed to look up 'Total_allele_count' in [{'Total_allele_count': '52413,1', 'Male_allele_count': '11142,0', 'West_allele_count': 0}] 

wenn Sie genau hinschauen, ist der Wert eine Liste und der Schlüssel ist eine Zeichenfolge, so dass die endgültige Lösung ist dann:

lookup(source, 'alterations', 0, org, 'exact_matches', 0, 'exac_allele', 0, allele) 
0

Wie geht um:

toAppend = [int(x) for x in source['alterations'][0][org]['exact_matches'][0]['exac_allele'][0][allele].split('/')]

(Ich vermute, dies ist nur eine gerade nach oben Fehler/Bug und nicht wirklich die json Struktur Missverständnis)

Sie sollten auch die bare außer entfernen (a s @ thebjorn elludes in einem Kommentar), weil es wahrscheinlich diesen Fehler (und wahrscheinlich andere) maskiert.