在python中创建JSON对象

use*_*828 0 python string-formatting python-2.7

我试图创建一个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'
Run Code Online (Sandbox Code Playgroud)

用下面的代码

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')
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

Eli*_*eri 5

您正在使用json.dump()函数错误。

您传递一个对象和一个文件对象:

json.dump(object, fileobject)
Run Code Online (Sandbox Code Playgroud)

使用dict进行键值映射:

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')
Run Code Online (Sandbox Code Playgroud)