根据NCBI中的蛋白名在uniprot中查找对应蛋白登录号及基因名

  • 想法来源
    • 第一个客户
    • 第二位客户
  • 代码分享
  • 反思

想法来源

首先,我要感谢我从事蛋白质组分析工作中遇到的形(xi)形(qi)色(gu)色(guai)的客户,我还是非常热衷于为客户服务的。最后完成的脚本算是我为了完成客户需求一点点摸索出来的成果。

第一个客户

第一次涉及到这个需求的客户指出,在我们完成蛋白质组结果中(客户指定使用NCBI数据库)没有提供蛋白对应的基因名,需要我们在提供的结果中添加一下对应的基因名。

???
???
来看看数据库,除了特殊的自建库及客户提供的转录组数据单框翻译外,我们常用的蛋白数据库基本就是Uniprot和NCBI,就以这两个数据的.fasta文件对比。

>ACD58760.1 hypothetical protein PXO_00731 [Xanthomonas oryzae pv. oryzae PXO99A]
MGILIYLVPASALWALIATALAFVRGRQLRAESSELASTQDRLGSYQAALSQQKARAAATTLELESLQRS
YAVLKQSLEQQEQNASEQQEQNASEQQAATAGQVIPMVLVQRLDIASEIGTLFGHVARVARILRRYSAYS
RGHNAPEPATARYDLHWLADCLHSFDQLGHALVHGNVAALITACQDLLSMYEHYLKDGSGYNSRDTFQRL
SHDVPLSEATDAIRSIIVKATLAQDVQDAVQNDEVTANVG
上面这个是NCBI的,下面这个是uniprot
>tr|A0A0K0GK93|A0A0K0GK93_XANOP Uncharacterized protein OS=Xanthomonas oryzae pv. oryzae (strain PXO99A) OX=360094 GN=PXO_00731 PE=4 SV=1
MGILIYLVPASALWALIATALAFVRGRQLRAESSELASTQDRLGSYQAALSQQKARAAATTLELESLQRS
YAVLKQSLEQQEQNASEQQEQNASEQQAATAGQVIPMVLVQRLDIASEIGTLFGHVARVARILRRYSAYS
RGHNAPEPATARYDLHWLADCLHSFDQLGHALVHGNVAALITACQDLLSMYEHYLKDGSGYNSRDTFQRL
SHDVPLSEATDAIRSIIVKATLAQDVQDAVQNDEVTANVG

虽然在NCBI的数据库中蛋白描述部分确实有PXO_00731,但是这是这个蛋白缺少验证数据的原因产生的特殊情况,在NCBI的数据库文件中很少会在蛋白描述部分放入蛋白的基因名。(其实这个PXO_00731也不是基因名,只是还没系统命名导致的一个简单命名,暂代了基因名),而在uniprot数据库中基因名是有专门的位置标注了“GN=PXO_00731”。
这也就是客户想要的结果,但是咋弄啊,一个是NCBI的数据库,一个是uniprot的数据库。(你是不是在心里说了句一个个查,一个个粘?
再来看看NCBI中搜索这个蛋白的内容
在这段信息中该蛋白作为CDS区翻译的结果对应的基因序列名是有标注的。
我看这段内容看着挺简单的呀,要是把每个蛋白的这部分信息用python爬虫爬出来,再用perl处理一下是不是就能拿到想要的结果了?(也许你会很奇怪为啥不直接用python处理,因为我的python真的很L J等于没学,perl相对来说用的强点)
于是我参考了论坛里大佬分享的一个爬虫教学Python爬虫超详细讲解(零基础入门,老年人都看的懂)
但是,但是啊,爬不出来,真的爬不出来。
我把完整的网页源码加载出来放在.txt文件里查找要的信息,发现NCBI对蛋白描述那部分的内容并不在源码中,加上我对前端,js,css啥的也是基本等于0,也不知道是不是我水平不到家,还是NCBI有意防着我。捣鼓了半天也没个结果,我选择了放弃,跟我这位可爱的客户说了“臣妾做不到啊!”

第二位客户

第二位客户,跟第一位客户的背景是一样的,但是第二位客户客户给我的售后申请中附加了一个他期望的结果样式图(就是一个表格的截图),我就不放原图了,害怕客户看到我用他的图片写文章会给我一个爱(fen)的(nu)拥(tou)抱(su)。

蛋白Group 主要蛋白 蛋白描述 基因名
来自uniprot的机密 机密 机密 机密

我本能的又想说一句“臣妾。。。好像。。。又行了”。
这位客户在第一列中加入的蛋白名并不是我们给他使用的NCBI数据库中的名字,而是这个蛋白在uniprot中的蛋白名。对呀,这几个数据库其实是有互相保留对方的联系。。呸,蛋白名的。如果我拿NCBI中的蛋白名去uniprot中搜索会不会。。。。。,嘿嘿,嘿嘿嘿。

看看情况如何

基因名有了!!!uniprot中的蛋白名都有了。
那如果我再爬uniprot源码中的这两个结果是不是就可以获得想要的结果了?
于是我又去看那个老年人教程,遇事不决,再来一遍。
阔德行了!这次真的阔德行了。谢谢大佬,谢谢我亲爱的客户。

代码分享

原本思路是python和perl结合的,python爬网页代码,perl从所有代码中摘取数据。
但是突然想在论坛里发篇文章还是好(拉)好(高)改(逼)善(格)一下。所以正则部分还是循着大佬的思路用python进行。

import requests
import urllib.request, urllib.error
import re
import os
#from bs4 import BeautifulSoup# 判断文件夹是否存在,不存在则创建一个
#if not os.path.exists("./temp"):#这个文件夹是用来存放网页源码的.txt文件
#   os.mkdir("./temp")with open("protein.txt", "r") as f:data = f.readlines()# print (len(data))# data = data.strip('\n')# print (data[0])#print (data[i])
baseurl = "https://www.uniprot.org/uniprot/?query="
size = "&sort=score"  #用来拼接和protein.txt中的蛋白名拼接成链接baseurl+“name”+size
findGn = re.compile(r'<span class="shortName">(.*?)</span>', re.S)
findUn = re.compile(r'id=\"checkbox_(.*?)\" type="checkbox\"/',re.S)#其实应该要摘取的不是这个正则的,但是要摘的位置的正则有些麻烦,取了个巧,用这个正则可以获取相同的信息。def askURL(url):head = {   "User-Agent": "Mozilla / 5.0(Windows NT 10.0; Win64; x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 80.0.3987.122  Safari / 537.36"}# 用户代理,表示告诉豆瓣服务器,我们是什么类型的机器、浏览器(本质上是告诉浏览器,我们可以接收什么水平的文件内容)request = urllib.request.Request(url, headers=head)html = ""try:response = urllib.request.urlopen(request)html = response.read().decode("utf-8")except urllib.error.URLError as e:if hasattr(e, "code"):print(e.code)if hasattr(e, "reason"):print(e.reason)return htmla = ("./temp.txt")
with open (a,"w",encoding='utf-8') as first:first.write("name\tuniprot name\tdes\n")
for i in range(0, len(data)):  # 准备的蛋白名有多少个文件有多少行name = data[i].strip('\n')url = baseurl + name + sizehtml = askURL(url)  # 保存获取到的网页源码m = ("./temp/"+name+".txt")#with open (m,"w",encoding="utf-8") as htlm:  #注释掉的部分是将网页源码以.txt格式存放入temp文件夹中#   htlm.write(html)gn = re.findall(findGn, html)[0]un = re.findall(findUn, html)[0]with open (a,"a",encoding='utf-8') as out:out.write(name + ("\t")+ un + ("\t")+ gn +("\n"))print(name)b = ("./result.txt")
with open (b,"w",encoding="utf-8") as refirst:refirst.write ("name\tuniprot name\tGene Name\n")with open("temp.txt", "r") as temp:teda = temp.readlines()for j in range(1,len(teda)):res1 = teda[j].replace("\t ","\t")res2 = res1.replace(" \n","\n")res3 = res2.replace("<strong>","")res4 = res3.replace(" ",",")res5 = res4.replace("</strong>","")#删除不要的标签,将uniprot中出现的gene name用,拼接放在结果文件中#我承认这个循环。。。。很lowwith open (b,"a",encoding="utf-8") as reinf:reinf.write(res5)

总的思路还是比较简单,事先准备一个protein.txt文件夹把要爬取的蛋白名(NCBI)粘进去,换行符分隔。temp中存放的是爬取的网页源码(代码中该部分被注释掉了),temp.txt文件中存放的是为处理过的正则爬取结果,result.txt中就是结果啦。

反思

其实这个思路还是存在一些潜在问题的:
1.通常NCBI中获取的物种蛋白库会比uniprot大很多,这是因为NCBI在处理冗余序列时并没有那么细,而uniprot则会对那些高重复的冗余序列进行归并,所以两个网站提供的蛋白名可能会出现不一一对应的情况(至少我目前测的两个物种没遇到,感觉会有这种情况)。
2.另外两个网站都是会周期性维护更新的,会不会某一方对一个蛋白进行了信息更新,而另一方没有跟上脚步呢?还是有可能的,这应该也会导致二者对应不上吧,我感觉。。。。
3.还有如果客户是很早之前做的分析,很晚才来做的售后,这个数据库早就更新好几代了,那以前的蛋白名(NCBI)在现在的uniprot官网中搜还能搜到吗?我不知道。。。。

根据NCBI中的蛋白名在uniprot中查找对应蛋白登录号及基因名相关推荐

  1. python的requests爬取Uniprot中蛋白序列和N-糖基化位点

    1. 目的: 从Uniprot中下载某个蛋白 (以 P05067 为例) 对应的N-糖基化位点以及该蛋白的序列. 2. python3脚本: import requests import re fro ...

  2. java中实现具有传递性吗_Java中volatile关键字详解,jvm内存模型,原子性、可见性、有序性...

    一.Java内存模型 想要理解volatile为什么能确保可见性,就要先理解Java中的内存模型是什么样的. Java内存模型规定了所有的变量都存储在主内存中.每条线程中还有自己的工作内存,线程的工作 ...

  3. 把myeclipse中的web项目导入eclipse中不能编程web项目的解决办法

    title: 把myeclipse中的web项目导入eclipse中不能编程web项目的解决办法 tags: grammar_cjkRuby: true --- 右键单击项目,properties-- ...

  4. Gridview导出到Excel,Gridview中的各类控件,Gridview中删除记录的处理

    Asp.net 2.0中新增的gridview控件,是十分强大的数据展示控件,在前面的系列文章里,分别展示了其中很多的基本用法和技巧(详见< ASP.NET 2.0中Gridview控件高级技巧 ...

  5. php foreach嵌套foreach,php中foreach怎么嵌套foreach PHP中foreach函数用法?

    foreach的使用方法小编不是很明确,分享达人指教一下.foreach (array_expressforeach($array as $key) { if(xxxx) { break; //bre ...

  6. 关于python缩进的描述中_关于Python程序中与“缩进”有关的说法中,以下选项中正确的是()...

    关于Python程序中与"缩进"有关的说法中,以下选项中正确的是() 答:缩进在程序中长度统一且强制使用 同文学或同音乐主题的民歌,<_______>是其中之一.此曲经 ...

  7. java中super用来定义父类,Java中super的几种用法及与this的区别

    综观目前的 Web 应用,多数应用都具备任务调度的功能.本文由浅入深介绍了几种任务调度的 Java 实现方法,包括 Timer,Scheduler, Quartz 以及 JCron Tab,并对其优缺 ...

  8. sql语句中left join和inner join中的on与where的区别分析

    原文:sql语句中left join和inner join中的on与where的区别分析 关于SQL SERVER的表联接查询INNER JOIN .LEFT JOIN和RIGHT JOIN,经常会用 ...

  9. c语言中浮点数和整数转换_C中的数据类型-整数,浮点数和空隙说明

    c语言中浮点数和整数转换 C中的数据类型 (Data Types in C) There are several different ways to store data in C, and they ...

最新文章

  1. PHP feof() 函数读文件的使用
  2. flask uwsgi nginx *504* Gateway Time ou解决办法
  3. JavaScript 日期联动选择器
  4. css h5移动端背景铺满
  5. 一、SQL语法——4-数据库约束
  6. COJ1183(计算表达式的值)
  7. matlab padarray
  8. Vue学习之路---No.5(分享心得,欢迎批评指正)
  9. Atitit Atitit.软件兼容性原理----------API兼容 Qa7
  10. echarts的pie图中,各区块颜色的调整
  11. R语言 MCMC算法及其实现
  12. Syzmlw 蜗居在线播放
  13. 台式计算机无法连接网络,台式电脑无法连接无线网络怎么办
  14. 计算机组老师颁奖词,优秀教研团队颁奖词
  15. 计算机英语手抄报活动主题,英语手抄报比赛方案
  16. 06、江苏专转本(专业课笔记)第六章、信息系统与数据库
  17. node+ npm + yarn 安装及上手
  18. 计算机网络实验一 网络命令
  19. 解决:IEDA在plugins里搜不到mybatisx插件
  20. 2015年高教社杯全国大学生数学建模竞赛A题 “互联网+”时代的出租车资源配置

热门文章

  1. 代码走读测试案例分享
  2. 【资讯】国家级转基因大豆玉米品种审定标准
  3. Java Class05
  4. 实现android按键震动按键声音的机制
  5. 李子的猜数游戏delta1.1紧急修复版本
  6. Ubuntu永久修改USB设备操作权限
  7. python气象卫星云图解析_使用 PyQt 滚动播放卫星云图
  8. 初识大数据(三)旅游大数据
  9. jqweui实现图片上传预览
  10. 地牢猎手2 Android,地牢猎手2高清版 Dungeon Hunter 2 HD