在 python 中创建一个 JSON 对象
Create a JSON object in 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')
我错过了什么?
您需要双倍 {
和 }
非占位符的字符; {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)
您使用的 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')
我正在尝试创建一个 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')
我错过了什么?
您需要双倍 {
和 }
非占位符的字符; {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)
您使用的 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')