python批量爬取NCBI基因注釋并調(diào)用谷歌API批量翻譯

今天是2020-02-09
作者:沙雕學(xué)習(xí)小組
這里有視頻教程:
https://www.bilibili.com/video/av87724182
今天想實(shí)現(xiàn)這個(gè)功能:
差異分析得到了200多個(gè)基因(甚至更多)

1

我要一個(gè)一個(gè)把基因的summary信息得到,要手動(dòng)一個(gè)一個(gè)查可能要查到下個(gè)星期晓猛,周五就要匯報(bào)了啊……!


2

有python怕啥?!不要慌

動(dòng)手之前先動(dòng)腦

step1:獲取這個(gè)基因在NCBI上的summary信息——輸入gene.txt得到genesummary.txt
step2:檢查輸出文件是否有空行壁却,若有刪掉輸入genesummary.txt得到newsummary.txt
step3:批量翻譯——輸入newsummary.txt造锅,得到genetrans.txt

step1:獲取這個(gè)基因在NCBI上的summary信息——輸入gene.txt得到genesummary.txt

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:Abao

from Bio import Entrez # pip install biopython
#from translate_api.translate_api import api # pip install translate_api
#from Pytrans import *
import re

Entrez.email = "shinningbzw@foxmail.com" # email

#這里修改文件路徑和文件名,絕對(duì)路徑
output_file = 'genesummary.txt' # 注意你的輸出文件路徑:絕對(duì)路徑
input_file = 'gene.txt'# 輸入文件:去重后的基因列表 (將基因列保存為 txt馏慨,uniq *.txt>gene_list.txt )


gene_list = []
line_c = []
count = len(open(input_file, 'r').readlines())
print("Waiting...")

#from Pytrans import *
import requests
from Pytrans import *

def google_translate(content):
    '''google translation'''
    js = Pytrans()
    tk = js.getTk(content)

    if len(content) > 4891:
        print("too long9』础!写隶!")
        return

    param = {'tk': tk, 'q': content}

    result = requests.get("""http://translate.google.cn/translate_a/single?client=t&sl=en
        &tl=zh-CN&hl=zh-CN&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss
        &dt=t&ie=UTF-8&oe=UTF-8&clearbtn=1&otf=1&pc=1&srcrom=0&ssel=0&tsel=0&kc=2""", params=param)

    trans = result.json()[0]
    ret = ''
    # for i in range(len(trans)):
    #     line = trans[i][0]
    #     if line != None:
    #         ret += trans[i][0]
    for i in range(len(trans)):
        line = trans[i][0]
        if line != None:
            ret += trans[i][0]

    return ret


#a = google_translate("hello倔撞,Input file will be translated, please be patient")
#print(a)


# get gene list
for line in open(input_file):
    if line != "基因":
        gene_list.append(line)

gene_list.remove(gene_list[0])
rm_pattern = re.compile('\[.*?\]')


with open(output_file, 'a+', encoding='utf-8') as f:
    for line in gene_list:
        gene = str(line.strip())
        gene_term = "(" + gene +"[Gene Name]) AND Homo sapiens[Organism]"
        Entrez.email = "shinningbzw@foxmail.com"
        handle = Entrez.esearch(db="gene", term=gene_term)
        gene_id = Entrez.read(handle)['IdList'][0]
        sum_handle = Entrez.esummary(db="gene", id=gene_id)
        sum_record = Entrez.read(sum_handle)
        r_gene_sum = sum_record['DocumentSummarySet']['DocumentSummary'][0]['Summary']
        gene_sum = rm_pattern.sub('', r_gene_sum)
        #translation = google_translate(gene_sum)
        #f.write(gene + "\n" + gene_sum + "\n" + translation + "\n")
        f.write(gene + "\n" + gene_sum + "\n" )
        line_c.append("b")
        if count % len(line_c) == 0:
            perc = (len(line_c) / count) * 100
            print("Completed " + str(int(perc)) + "%")

step2:檢查輸出文件是否有空行,若有刪掉樟澜。輸入genesummary.txt得到newsummary.txt

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:cici

#這里修改你的文件路徑误窖,請(qǐng)看清文件名奧~
with open('genesummary.txt', 'r', encoding='utf-8') as fr, open('newsummary.txt', 'w', encoding='utf-8') as fd:
    for text in fr.readlines():
        if text.split():
            fd.write(text)
    print('輸出成功....')

step3:批量翻譯

這里先寫(xiě)個(gè)函數(shù)

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:Topshi

import execjs


class Pytrans():
    def __init__(self):
        self.ctx = execjs.compile("""
        function TL(a) {
        var k = "";
        var b = 406644;
        var b1 = 3293161072;

        var jd = ".";
        var $b = "+-a^+6";
        var Zb = "+-3^+b+-f";

        for (var e = [], f = 0, g = 0; g < a.length; g++) {
            var m = a.charCodeAt(g);
            128 > m ? e[f++] = m : (2048 > m ? e[f++] = m >> 6 | 192 : (55296 == (m & 64512) && g + 1 < a.length && 56320 == (a.charCodeAt(g + 1) & 64512) ? (m = 65536 + ((m & 1023) << 10) + (a.charCodeAt(++g) & 1023),
            e[f++] = m >> 18 | 240,
            e[f++] = m >> 12 & 63 | 128) : e[f++] = m >> 12 | 224,
            e[f++] = m >> 6 & 63 | 128),
            e[f++] = m & 63 | 128)
        }
        a = b;
        for (f = 0; f < e.length; f++) a += e[f],
        a = RL(a, $b);
        a = RL(a, Zb);
        a ^= b1 || 0;
        0 > a && (a = (a & 2147483647) + 2147483648);
        a %= 1E6;
        return a.toString() + jd + (a ^ b)
    };

    function RL(a, b) {
        var t = "a";
        var Yb = "+";
        for (var c = 0; c < b.length - 2; c += 3) {
            var d = b.charAt(c + 2),
            d = d >= t ? d.charCodeAt(0) - 87 : Number(d),
            d = b.charAt(c + 1) == Yb ? a >>> d: a << d;
            a = b.charAt(c) == Yb ? a + d & 4294967295 : a ^ d
        }
        return a
    }
    """)

    def getTk(self, text):
        return self.ctx.call("TL", text)

調(diào)用這個(gè)函數(shù)——輸入newsummary.txt,得到genetrans.txt

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:Topshi
from Pytrans import *
import requests


def google_translate(content):
    '''google translation'''
    js = Pytrans()
    tk = js.getTk(content)

    if len(content) > 4891:
        print("too longV确 E场!")
        return

    param = {'tk': tk, 'q': content}

    result = requests.get("""http://translate.google.cn/translate_a/single?client=t&sl=en
        &tl=zh-CN&hl=zh-CN&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss
        &dt=t&ie=UTF-8&oe=UTF-8&clearbtn=1&otf=1&pc=1&srcrom=0&ssel=0&tsel=0&kc=2""", params=param)

    trans = result.json()[0]
    ret = ''
    for i in range(len(trans)):
        line = trans[i][0]
        if line != None:
            ret += trans[i][0]

    return ret


a = google_translate("hello毒费,Input file will be translated, please be patient")
print(a)

genotype_annotation_list = []

translate_file = open('genetrans.txt', "a+", encoding='utf-8')

with open('newsummary.txt', 'r') as f: #有空行會(huì)報(bào)錯(cuò)丙唧!!

    for element in f:
        genotype_annotation_list.append(element.strip())
# print(genotype_annotation_list)
count = 0
for ga in genotype_annotation_list:
    translation = google_translate(ga)
    #translate_file.write(ga + '\t' + translation + '\n')
    translate_file.write(translation + '\n')
    count += 1
    print('complete', '%.1f%%' % ((count / len(genotype_annotation_list)) * 100))

歡迎關(guān)注我的公眾號(hào):
天黑請(qǐng)閉眼預(yù)言家請(qǐng)睜眼.jpg
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市觅玻,隨后出現(xiàn)的幾起案子想际,更是在濱河造成了極大的恐慌,老刑警劉巖溪厘,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胡本,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡畸悬,警方通過(guò)查閱死者的電腦和手機(jī)侧甫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蹋宦,“玉大人披粟,你說(shuō)我怎么就攤上這事±淙撸” “怎么了守屉?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蒿辙。 經(jīng)常有香客問(wèn)我拇泛,道長(zhǎng),這世上最難降的妖魔是什么思灌? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任碰镜,我火速辦了婚禮,結(jié)果婚禮上习瑰,老公的妹妹穿的比我還像新娘。我一直安慰自己秽荤,他們只是感情好甜奄,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布柠横。 她就那樣靜靜地躺著,像睡著了一般课兄。 火紅的嫁衣襯著肌膚如雪牍氛。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天烟阐,我揣著相機(jī)與錄音搬俊,去河邊找鬼。 笑死蜒茄,一個(gè)胖子當(dāng)著我的面吹牛唉擂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播檀葛,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼玩祟,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了屿聋?” 一聲冷哼從身側(cè)響起空扎,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎润讥,沒(méi)想到半個(gè)月后转锈,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡楚殿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年撮慨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片勒魔。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡甫煞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出冠绢,到底是詐尸還是另有隱情抚吠,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布弟胀,位于F島的核電站楷力,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏孵户。R本人自食惡果不足惜萧朝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望夏哭。 院中可真熱鬧检柬,春花似錦、人聲如沸竖配。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至用爪,卻和暖如春原押,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背偎血。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工诸衔, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人颇玷。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓笨农,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親亚隙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子磁餐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容