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)
Ihre json unvollständig ist. –
"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