社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

生信杂谈 • 8 年前 • 985 次点击  



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

最开始,是需要将基因跟其编码的蛋白质对应起来,找遍了各种数据库都没发现有相关的注释文件,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 urlencodefrom urllib.request import urlopen, Requestdef 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延迟吧,如果给对方造成太大的服务器压力,给人家惹麻烦,如果人家觉着需要维护,或者难以维持,直接暂停提供服务,,,

是的,我就是这么恶俗,就是这么喜欢这图


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/xbio8ysI1r
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/2401
 
985 次点击