美文网首页生物信息学与算法
生信编程实战第12题(python)

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

作者: 天秤座的机器狗 | 来源:发表于2018-08-26 20:09 被阅读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的学习

    相关文章

      网友评论

        本文标题:生信编程实战第12题(python)

        本文链接:https://www.haomeiwen.com/subject/artaiftx.html