#Python#提取基因对应的蛋白质名

提取基因对应的蛋白质官方名

最开始,是需要将基因跟其编码的蛋白质对应起来,找遍了各种数据库都没发现有相关的注释文件,Uniprot作为处理蛋白质的大佬,结果里都有,肯定有办法能够满足需求。

搜索TP53得到的结果页面,明显有各种p53的蛋白质名称

所幸的是,我完全没想用爬虫直接爬人家,而是戳了一下FAQ
发现人家有官方API,可以供我们胡作非为
Uniprot官方提供了各种API来满足各种稀奇古怪的需求

所有API:http://www.uniprot.org/help/api

各种功能的API介绍

Uniprot API的使用

ID信息转换
满足我需求的最重要的部分就是各种ID信息的转换和提取

ID转换相关:http://www.uniprot.org/help/api_idmapping

各种能够转换的ID,上边还有四种常用语言的示例

ID转换相关的页面里包含了所有的能够互相转换的各种ID
相应的,人家提供了多种不同代码的示例,以python为例:

python的示例基于python2


# 导入urllib和urllib2两个模块,用来处理各种网络请求
import urllib,urllib2
# uniprot的api端口
url = 'http://www.uniprot.org/uploadlists/'
# 提交的参数
params = {
    # 将什么ID转化成什么ID, from to
    # 目前没发现能够转换成多种不同的ID,只能一一转化
    'from':'ACC',
    'to':'P_REFSEQ_AC',
    # 返回结果的格式
    'format':'tab',
    # 要转换的ID
    'query':'P13368 P20806 Q9UM73 P97793 Q17192'
}
# 因为http传输的是bytes等,因此需要将参数转码
data = urllib.urlencode(params)
# 通过Request指定获取哪台服务器的什么信息
request = urllib2.Request(url, data)
# 你自己的邮箱,如果有问题,人家好联系(比如API使用的频率太高,人家服务器受不了)
contact = "" # Please set your email address here to help us debug in case of problems.
# 添加相应的标准提取头,不是这个信息,应该就提取不到任何信息了
request.add_header('User-Agent', 'Python %s' % contact)
# 打开url,获取服务器返回的信息
response = urllib2.urlopen(request)
# 就只读取前多少个字符
page = response.read(200000)

由于我是python3的使用者,所以,没法拿来主义,经过简单修改就正常使用了

经过对众多ID的测试之后发现,其他ID转化成ACC的时候,包含的信息量格外的多,其中就有我急需的蛋白质名称,因此,通过将一个基因名转化成ACC来测试一下看看,能不能提取到该基因编码蛋白的所有名称

#!/usr/bin/python3
# python3将urllib2拆分了,因此,从urllib里分别导入
from urllib.parse import urlencode
from urllib.request import urlopen, Request

def test(query=['TP53']):
    # 依然是这个接口
    url = 'http://www.uniprot.org/uploadlists/'

    params = {
        # 针对我最初的需求,from暂时改成gene name
        'from': 'GENENAME',
        # 是的,我在ACC里发现,protein name了,虽然只有推荐名,其他的名字统统没有
        'to': 'ACC',
        'format': 'tab',
        # 以list的形式传递基因名啥的,通过join就修成需要的字符串了
        'query': ' '.join(query)
    }
    # urlencode只是将字典形式的参数转换成字符串而已,并不能转成bytes,因此,需要多一层encode
    data = urlencode(params).encode()
    # 同上
    request = Request(url, data)
    # Please set your email address here to help us debug in case of problems.
    contact = "xxxxx@gmail.com"
    request.add_header('User-Agent', 'Python %s' % contact)
    response = urlopen(request)
    page = response.read(200000)
    # 获取到的信息是bytes编码的,需要以utf-8等解码才正常读取
    print(page.decode('utf-8'))

但是,解码出来的是一个以\n \t分隔的完整字符串,为了能够正常提取所需信息,需要对其进行分割

print出来当然就是一个文本文件的样子
# 将API返回的结果,调用函数进行有效分割,我的用法如下
split_(page.decode('utf-8'))    # 上边最后的那一行print(),就改成这么用就好了

def split_(data):
    # 按行分割,如同打开一个文件按行读取
    data = data.split('\n')

    resutls = set()
    for line in data:
        # 我只要人体的
        if 'Homo sapiens' in line:
            # 将每一行,按照\t来分割,原因很明显,按空白符分割就分割的太碎,不利于各种信息的提取
            # 数一数,就会发现,蛋白名称是每行的倒数第四列
            protein_name = line.split('\t')[-4]
            # 每个蛋白编码名称后边都会有一个括号的注释,比较烦,就通过分割去掉
            protein_name = protein_name.split(' (')[0]
            # 然后加到set里边,去除重复
            results.add(protein_name)
    return results

# 嫌上边的写法麻烦就改成一行实现上边的功能
def split_(data):
    reutrn set(line.split('\t')[-4].split(' (')[0] for line in data if 'Homo sapiens' in line)

分割的成果

最终,我们就能获取到TP53基因对应的蛋白质名称了

TP53编码蛋白的所有名称

然后通过反复的爬取,将结果储存为json,或者直接存到数据库中,方便以后的取用都方便的很
如果要用模糊匹配来验证某些东西,推荐使用fuzzyfinder和fuzzywuzzy这两个python模块

其次,还有一个mygene的模块用来提取各种基因的信息也是极妙的,配合上这个API可以做很多幺蛾子。

特别需要注意的一点就是,如果要短时间内大批量的调用这个API,随机设一个sleep延迟吧,如果给对方造成太大的服务器压力,给人家惹麻烦,如果人家觉着需要维护,或者难以维持,直接暂停提供服务,,,

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容

  • # Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列...
    aimaile阅读 26,441评论 6 428
  • GitHub 上有一个 Awesome - XXX 系列的资源整理,资源非常丰富,涉及面非常广。awesome-p...
    若与阅读 18,615评论 4 418
  • 叶圣陶先生曾说过一句精辟的话:教是为了不教。 意思就是,教的目的不在于全盘授受,而应该重点启发引导,让学习者展卷而...
    杨成yc阅读 788评论 3 8
  • 每一次我都想见你,也好像一定要见你。 像是某种仪式感,看到你,我就记得我是谁,我就记得那些15岁的夜里你给我发的短...
    李肚子阅读 285评论 0 0
  • 阿黑来到学校的门口,正要往园区里进,没成想却被门卫给拦住了,因为平日里门口执勤的门卫都只是坐在岗亭之中,所以它稍微...
    说书客阅读 106评论 0 0