2017-10-28 29 views
0

JSONオブジェクトを作成してリストに追加しようとしていますが、成功しません。次のコードは、私が見逃してやったPythonでJSONオブジェクトを作成する

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') 

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' 

: 私は、このエラーのマッサージを得ましたか。

+2

はJSON文書の一部であるべきということですが?これは、不透明な文字列値としてダンプされるためです。それはこれまで有効なJSONと見なすことはできませんでした。 –

答えて

2

あなたは間違ってjson.dump()関数を使用しています。

あなたがオブジェクトとファイルオブジェクト渡し:キー値のマッピングのための

json.dump(object, fileobject) 

使用辞書:

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

'' {{"source":{"'これはhttps://github.com/nicgirault/circosJS#chordsに必要なので、[["source":{"'を得ることができますか? – user977828

+0

キー/値ペアをリスト/配列内に配置することはできません。これは無効なJSON文字列です。自分でJSON文字列の書式設定を停止してください。 –

+0

そうですね、各行の要素を新しい行に書き込むことはどうですか? – user977828

1

ダブル{ととプレースホルダではない文字が必要です。 {id:...}が他名前プレースホルダとして見られている:

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

{{}}配列は、結果における単一{}文字として終わります。

個別にすべての部品を置くのではなく、番号が使用スロット:

tmp = (
    "[source: {{id: '{0}',start: {2},end: {3}}}," 
    "target: {{id: '{1}',start: {4}, end: {5}}}],").format(
     *parts) 
あなたのTSVデータを読み取るために csvモジュールを使用することを検討すべきである、とあなたが上記のデータのためのものならばの一部であることを

JSONドキュメント(埋め込みストリングとしてではなく、別々のJSON配列とオブジェクトとして)、ストリングとしてフォーマットすることはできません。

あなたは最初にかかわらず、整数にあなたのCSVの列を変換する必要があります:

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

なぜオブジェクトをリストの中に挿入していますか? [{source:{}}]を使ってどんな使い方ができますか? –

+0

@ElisByberiこれはOPが構築していた文字列のためです。それは必要でない場合、軽く落とした。残念なことに、OPは彼らが作り出そうとしているものについての出力やドキュメンテーションを与えておらず、また期待していません。 –

+0

はい、私は見ました。とにかくこの質問は話題にはなりません。 –

関連する問題