生物信息学与算法

生信编程实战第12题(python)

2018-08-26  本文已影响26人  天秤座的机器狗

题目来自生信技能树论坛

image.png image.png

其实编程的题目最终要的是要搞清楚要做什么
先看看json文件是什么样的

less -S modencodeMetaData.json

image.png

根据题目的要求,就是json文件中红线框出来的这类给整理一下,整理成题目中的样子。
我的想法就是:
逐行读取
利用python中的正则表达式去匹配这些我们想整理的部分,构建键值对,最后打印出来

这里正则表达式中的pattern是

"\s+\"(.+)\"\s:\s\"(.+)\","

这个意思就是:
一个或多个空格+"+一个或多个除换行符之外的任意字符+"+一个空格+:+一个空格+"+一个或多个除换行符之外的任意字符+"+,
这样我只需要将每个line右边的空格换行符去掉,然后对每行去匹配这个pattern
就能得到需要整理的行
给出代码

import sys
import re
args=sys.argv
filename=args[1]
aDict={}
with open (filename) as fh :
   pattern = re.compile("\s+\"(.+)\"\s:\s\"(.+)\",")
   for line in fh:
     line=line.rstrip()
     mth=pattern.search(line)
     if mth:           #如果匹配上,mth就不是空
        a = mth.group(1)  #取出第一个括号里的内容
        b = mth.group(2)  #取出第二个括号里的内容
        if a not in aDict:
           aDict[a]=[b]
        else:
           aDict[a].append(b)
for k,v in aDict.items():
    z='\t'.join(v)            #因为v是列表,这一步就是把列表转换成字符串,方便查看
    print(k,z,sep="\t")

这里想提醒自己一点:
字典中想构建一个key对应多个value

if a not in aDict:
           aDict[a]=[b]
else:
           aDict[a].append(b)

这种应该很容易想到
还有列表转字符串的方法不要忘记
"".join(list)

最后看一下结果吧

python3 exc.py modencodeMetaData.json |less -S
image.png

导入excel看看

image.png

以上,12道题目全部做完了,接下来我会用R再做一遍,加强一下R的学习

上一篇 下一篇

猜你喜欢

热点阅读