2017-10-28 240 views
0

我想創建一個JSON對象並將其附加到列表中,但沒有成功。 我得到這個錯誤按摩:在python中創建一個JSON對象

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' 

用下面的代碼

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

我錯過了什麼?

+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」:{「'是否有可能獲得'[[」source「:{」'因爲我需要這個https://github.com/nicgirault/circosJS#chords? – user977828

+0

您不能將一個鍵值對放入列表/數組中。這將是一個無效的JSON字符串。請自行停止格式化JSON字符串。 –

+0

你是對的,怎麼可能在一個新行中寫每個列表元素? – user977828

1

您需要double{}不是佔位符的字符; {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) 

你應該考慮使用csv模塊讀取您的TSV的數據,如果你的意思是針對上述數據是部分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

是的,我看到了。無論如何,這個問題是無關緊要的。 –