2017-10-28 5 views
0

Ich versuche, ein JSON-Objekt zu erstellen und an eine Liste anfügen, aber ohne Erfolg. bekam ich diesen Fehler Massage mit:Erstellen Sie ein JSON-Objekt in Python

Traceback (most recent call last): 
    File "/projects/circos/test.py", line 32, in <module> 
    read_relationship('data/chr03_small_n10.blast') 
    File "/projects/circos/test.py", line 20, in read_relationship 
    tmp = ("[source: {id: '{}',start: {},end: {}},target: {id: '{}',start: {}, end: {}}],").format(parts[0],parts[2],parts[3],parts[1],parts[4],parts[5]) 
KeyError: 'id' 

mit dem folgenden Code

def read_relationship(filename): 
    data = [] 
    with open(filename) as f: 
     f.next() 
     for line in f: 
      try: 
       parts = line.rstrip().split('\t') 
       query_name = parts[0] 
       subject_name = parts[1] 
       query_start = parts[2] 
       query_end = parts[3] 
       subject_start = parts[4] 
       subject_end = parts[5] 


       # I need: [source: {id: 'Locus_1', start: 1, end: 1054}, target: {id: 'tig00007234', start: 140511, end: 137383}], 
       tmp = ("[source: {id: '{}',start: {},end: {}},target: {id: '{}',start: {}, end: {}}],").format(parts[0],parts[2],parts[3],parts[1],parts[4],parts[5]) 
       data.append(tmp) 

      except ValueError: 
       pass 

    with open('data/data.txt', 'w') as outfile: 
     json.dump(data, outfile) 


read_relationship('data/chr03_small_n10.blast') 

Was habe ich verpasst?

+2

Ist das Teil des JSON-Dokument sein soll? Weil es als undurchsichtiger Zeichenfolgenwert ausgegeben wird. Nicht dass es jemals als gültiges JSON gesehen werden könnte. –

Antwort

2

Sie verwenden json.dump() Funktion falsch.

Sie ein Objekt übergeben und ein Dateiobjekt:

json.dump(object, fileobject) 

Verwenden dict für Schlüsselwert-Mapping:

def read_relationship(filename): 
    data = [] 
    with open(filename) as f: 
     f.next() 
     for line in f: 
      try: 
       parts = line.rstrip().split('\t') 
       query_name = parts[0] 
       subject_name = parts[1] 
       query_start = parts[2] 
       query_end = parts[3] 
       subject_start = parts[4] 
       subject_end = parts[5] 

       # use dict here 
       item = { 
        'source': { 
         'id': query_name, 
         'start': subject_name, 
         'end': query_start 
       }, 
        'target': { 
         'id': query_end, 
         'start': subject_start, 
         'end': subject_end 
        } 
       } 
       data.append(item) 

      except ValueError: 
       pass 

    with open('data/data.txt', 'w') as outfile: 
     json.dump(data, outfile) 


read_relationship('data/chr03_small_n10.blast') 
+0

Anstatt '[{" source ": {" 'wäre es möglich,' [["source": {"' zu bekommen, weil ich es für dieses https://github.com/nicgirault/circosJS#chords benötige? – user977828

+0

Sie können ein Schlüssel/Wert-Paar nicht in eine Liste/ein Array einfügen. Es wäre eine ungültige JSON-Zeichenfolge. Bitte beenden Sie die Formatierung der JSON-Zeichenfolge selbst. –

+0

Sie richtig, wie ist es möglich, jedes Listenelement in einer neuen Zeile zu schreiben? – user977828

1

Sie müssen Doppel die { und } Zeichen, die keine Platzhalter sind; {id:...} wird ansonsten als benannte Platzhalter gesehen:

tmp = (
    "[source: {{id: '{}',start: {},end: {}}}," 
    "target: {{id: '{}',start: {}, end: {}}}],").format(
     parts[0], parts[2], parts[3], parts[1], parts[4], parts[5]) 

Die {{ und }} Sequenzen auf, als einzelne { und } Zeichen in der Folge beenden.

Anstatt getrennt alle Teile zu setzen, verwenden numerierten Ablagefächer:

tmp = (
    "[source: {{id: '{0}',start: {2},end: {3}}}," 
    "target: {{id: '{1}',start: {4}, end: {5}}}],").format(
     *parts) 

Sie sollten mit dem csv Modul betrachten Sie Ihre TSV Daten zu lesen, und wenn Sie für die obigen Daten gemeint Teil der sein JSON-Dokument (nicht als eingebettete Zeichenfolge, sondern als separate JSON-Arrays und -Objekte) und dann als Zeichenfolge formatiert wird nicht funktionieren.

Sie benötigen Ihre CSV-Spalten auf ganze Zahlen konvertieren jedoch zuerst:

import csv 
import json 

def read_relationship(filename): 
    data = [] 
    with open(filename, 'rb') as f: 
     reader = csv.reader(f, delimiter='\t') 
     next(reader, None) 
     for row in reader: 
      data.append([{ 
       'source': { 
        'id': row[0], 
        'start': int(row[2]), 
        'end': int(row[3]), 
       }, 
       'target': { 
        'id': row[1], 
        'start': int(row[4]), 
        'end': int(row[5]), 
       }, 
      }]) 

    with open('data/data.txt', 'w') as outfile: 
     json.dump(data, outfile) 
+0

Warum fügen Sie Objekte in eine Liste ein? Welchen Nutzen hätte man mit [{source: {}}]? –

+0

@ElisByberi, weil das die Zeichenfolge ist, die das OP erstellt hat. Es wird trivialerweise fallengelassen, wenn es nicht benötigt wird. Leider hat das OP keine Ausgabe oder Dokumentation zu dem, was es zu produzieren versucht, gegeben und erwartet. –

+0

Ja, ich sah. Diese Frage ist sowieso nicht Thema. –

Verwandte Themen