7.JSON格式数据的格式化
有一些五六年前的学生们都成长为了各个生物信息学相关公司的小领导,而且他们都有了自己的公众号,知乎号,也算是一番人物。最近他们跟我反馈面试找不到或者说很难直接考核筛选到认真干活的生信工程师,挺有意思的。让我想起来了早在生信技能树论坛创立之初我为了引流,而规划的200个生信工程师面试题。值得继续分享:
JSON格式简介
JSON(JavaScript Object Notation),是一种数据交互格式。
在JSON格式出现之前,大家都用XML传递数据。XML是一种纯文本格式,所以适合在网络上交换数据,但是XML格式比较复杂,知道拉格斯.克罗克福特发明了JSON这种超轻量级的数据交换格式。
JSON有两种数据格式:对象和数组
对象:用大括号表示,由键值对组成,每个键值对用逗号分隔开。其中key必须作为字符串而且是双引号,value可以是多种数据类型
数组 :用中括号表示,每个元素之间用逗号分隔开
JSON格式与python格式的对应
Python | JSON |
---|---|
dict | object |
list,tuple | array |
str | string |
Int, float | number |
True | true |
False | false |
None | null |
将python数据与json数据相互转换
导入JSON模块:import json python数据转换成json字符串:json_data = json.dumps(python_data); json字符串转换成python对象:python_data = json.loads(json_data)
JSON 文件下载
这使用的是TCGA的metadata
以下面的JSON数据为例https://portal.gdc.cancer.gov/auth/api/case_ssms
文件内容如下:
[{
"summary": {
"file_count": 5,
"data_categories": [
{
"file_count": 3,
"data_category": "Simple Nucleotide Variation"
},
{
"file_count": 1,
"data_category": "Biospecimen"
},
{
"file_count": 1,
"data_category": "Clinical"
}
]
},
"primary_site": "Bronchus and lung",
"project": {
"project_id": "FM-AD"
},
"submitter_id": "AD10770",
"demographic": {
"gender": "female"
}
},{
"summary": {
"file_count": 2,
"data_categories": [
{
"file_count": 1,
"data_category": "Simple Nucleotide Variation"
},
{
"file_count": 1,
"data_category": "Copy Number Variation"
}
]
Python解析复杂json文件
在使用脚本处理之前,先观察整个JSON文件的结构,确定哪些内容是自己需要的,大致了解文件 结构之后
#!/usr/bin/python
import pandas as pd
import json
from collections import OrderedDict
#1.将json格式转换为python对象,该对象主要由字典和列表组成
with open('cases.2021-02-25.json','r') as f:
data = json.load(f)
#2.将需要的字段放到列表中
Ks=[]
for test in data:
for a,b in test.items():
#print(a)
if a == 'summary':
for i in b.keys():
#print(i)
Ks.append(i)
if a == 'primary_site':
Ks.append(a)
#Ks.append(b.keys())
if a == 'project':
for i in b.keys():
Ks.append(i)
#Ks.append(b.keys())
if a == 'submitter_id':
Ks.append(a)
#Ks.append(b.keys())
if a == 'demographic':
for i in b.keys():
Ks.append(i)
#Ks.append(b.keys())
Ks_uniq = list(dict.fromkeys(Ks))
print(Ks_uniq)
#['file_count', 'data_categories', 'primary_site', 'project_id', 'submitter_id', 'gender']
my_dict=OrderedDict()
new_list=[]
for k in Ks_uniq:
my_dict[k]=[]
#有的字段没有出现嵌套,可以直接加入新的字典
for k in Ks_uniq:
for test in data:
if k not in test.keys():
new_list.append(k)
else:
my_dict[k].append(test[k])
new_list_uniq = list(dict.fromkeys(new_list))
print(new_list_uniq)
#添加嵌套字典中的字段
for test in data:
for k in test['summary']:
if k == 'file_count':
my_dict[k].append(test['summary'][k])
else:
category=[]
for da in test['summary'][k]:
for da_k in da.keys():
if da_k == 'data_category':
category.append(da['data_category'])
my_dict[k].append(category)
for k in test['project']:
my_dict[k].append(test['project'][k])
if 'demographic' in test:
for k in test['demographic']:
my_dict[k].append(test['demographic'][k])
else:
my_dict['gender'].append('Unknow')
#print(my_dict)
#将字典转换为数据框
keggOutput = pd.DataFrame.from_dict(my_dict,orient='columns',dtype=None)
print(keggOutput)
#将数据框写入到csv文件中
keggOutput.to_csv("cases.2021-02-25.csv")
for k,v in my_dict.items():
print(k, len(v))
结果文件如下: