Python腳本:fasta文件多序列信息統(tǒng)計(jì)

設(shè)計(jì)需求

統(tǒng)計(jì)fasta文件中多條序列信息,設(shè)計(jì)目標(biāo)效果:


圖片.png

將結(jié)果輸入到csv格式的表格中,因?yàn)閏sv格式表格用盔性,分隔數(shù)據(jù)。
腳本使用argparse模塊呢岗,提示輸入數(shù)據(jù)冕香。

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('integers', type=str, help='輸入fasta文件名')
args = parser.parse_args()
#獲得integers參數(shù)
print(args.integers)
讀取多個(gè)序列存入字典

當(dāng)fasta文件中多條序列時(shí),需要解決序列名與對(duì)應(yīng)序列的儲(chǔ)存問(wèn)題后豫。
創(chuàng)建一個(gè)fasta字典悉尾,將序列名字和序列儲(chǔ)存進(jìn)去。
當(dāng)line[0]也就是第一個(gè)字符等于>時(shí)挫酿,就將名字賦值給header构眯。
line[1:]是去除line第一個(gè)字符。因?yàn)閒asta以>開(kāi)頭去掉>才是真的名字饭豹。
如果line[0]不是>那就是序列鸵赖,那么我們就把序列儲(chǔ)存給fasta字典并對(duì)應(yīng)的序列名。
get()方法語(yǔ)法:
dict.get(key, default=None)
key -- 字典中要查找的鍵拄衰。
default -- 如果指定鍵的值不存在時(shí)它褪,返回該默認(rèn)值。
fasta[header] = fasta.get(header, '') + sequence使用這句是為了讓序列中換行的序列也儲(chǔ)存起來(lái)翘悉,連接兩個(gè)分行的序列茫打。

#讀取序列字典
def read_fasta(input):
    with open(input, 'r') as f:
        fasta = {}
        for line in f:
            line = line.strip()
            if line[0] == '>':
                header = line[1:]
            else:
                sequence = line
                fasta[header] = fasta.get(header, '') + sequence
    return fasta
統(tǒng)計(jì)序列信息的函數(shù)

命名這個(gè)函數(shù)為get_info,內(nèi)部參數(shù)為chr
在咱們會(huì)將fasta中ATCG的堿基內(nèi)容賦值給chr妖混,堿基可能有大寫(xiě)有小寫(xiě)老赤,所以我們使用.upper將所以字符變成大寫(xiě)。
再使用.count('G')統(tǒng)計(jì)ATCG各自的數(shù)量并賦值給對(duì)應(yīng)count_g制市,我們用ATCG各自的統(tǒng)計(jì)數(shù)可以在后面計(jì)算中免疫N值干擾抬旺。
gc含量計(jì)算其等于(G的數(shù)量+C的數(shù)量)/(A的數(shù)量+T的數(shù)量+C的數(shù)量+G的數(shù)量)
A的含量等于(A的數(shù)量)/(A的數(shù)量+T的數(shù)量+C的數(shù)量+G的數(shù)量),其他值的計(jì)算以此類推祥楣。
.format使用:
"{1} {0} {1}".format("hello", "world")設(shè)置指定位置开财。
'world hello world'
{:.2f} 保留小數(shù)點(diǎn)后兩位
最后,使用return返回函數(shù)結(jié)果(gc_con,A_content,T_content,C_content,G_content)

#統(tǒng)計(jì)序列信息的函數(shù)
def get_info(chr):
    chr = chr.upper()
    count_g = chr.count('G')
    count_c = chr.count('C')
    count_a = chr.count('A')
    count_t = chr.count('T')

    gc = (count_g + count_c) / (count_a + count_t + count_c + count_g)
    A = (count_a) / (count_a + count_t + count_c + count_g)
    T = (count_t) / (count_a + count_t + count_c + count_g)
    C = (count_c) / (count_a + count_t + count_c + count_g)
    G = (count_g) / (count_a + count_t + count_c + count_g)
    gc_con = '{:.2%}'.format(gc)
    A_content = '{:.2%}'.format(A)
    T_content = '{:.2%}'.format(T)
    C_content = '{:.2%}'.format(C)
    G_content = '{:.2%}'.format(G)
    return (gc_con,A_content,T_content,C_content,G_content)
更方便的命令行參數(shù)輸入

主要有三個(gè)步驟:
創(chuàng)建 ArgumentParser() 對(duì)象
調(diào)用 add_argument() 方法添加參數(shù)
使用 parse_args() 解析添加的參數(shù)
我們將添加的參數(shù)賦值給args

#設(shè)置輸入使用argparse
parser = argparse.ArgumentParser()
parser.add_argument('--input', '-i',
                        type=str,
                        help='input file in fasta format')
args = parser.parse_args()
輸出設(shè)置

首先我們通過(guò)之前的函數(shù)read_fasta獲得序列以及序列名的字典误褪,然后創(chuàng)建以輸入文件名為前綴的_sum.csv文件责鳍。
再將表格抬頭輸入進(jìn)去。

dict = read_fasta(args.input)
file_name = args.input.split('.')
name = file_name[0]
file_output = open("{}_sum.csv".format(name),'a')
file_output.write('name,length,GC content,A content,T content,C content,G content\n')
輸出運(yùn)算

通過(guò)for循環(huán)將字典里的每一個(gè)鍵都?xì)v遍兽间,通過(guò)get_info獲取序列堿基信息历葛。
用print打印到屏幕展示,用.write按照抬頭順序?qū)⑾嚓P(guān)信息輸入嘀略。

for val in dict:
    seq_info = get_info(dict[val])
    len_fasta = len(dict[val])
    print('******\n{0}\nlength:{1:d}\ngc content :{2}\nA content :{3}\nT content :{4}\nC content :{5}\nG content :{6}\n'.format(val,len_fasta,seq_info[0],seq_info[1],seq_info[2],seq_info[3],seq_info[4]))
    file_output.write('{0},{1},{2},{3},{4},{5},{6}\n'.format(val,len_fasta,seq_info[0],seq_info[1],seq_info[2],seq_info[3],seq_info[4]))
file_output.close()
全部代碼

附上全部代碼恤溶,可以直接使用

import argparse
#讀取序列字典
def read_fasta(input):
    with open(input, 'r') as f:
        fasta = {}
        for line in f:
            line = line.strip()
            if line[0] == '>':
                header = line[1:]
            else:
                sequence = line
                fasta[header] = fasta.get(header, '') + sequence
    return fasta
#統(tǒng)計(jì)序列信息的函數(shù)
def get_info(chr):
    chr = chr.upper()
    count_g = chr.count('G')
    count_c = chr.count('C')
    count_a = chr.count('A')
    count_t = chr.count('T')

    gc = (count_g + count_c) / (count_a + count_t + count_c + count_g)
    A = (count_a) / (count_a + count_t + count_c + count_g)
    T = (count_t) / (count_a + count_t + count_c + count_g)
    C = (count_c) / (count_a + count_t + count_c + count_g)
    G = (count_g) / (count_a + count_t + count_c + count_g)
    gc_con = '{:.2%}'.format(gc)
    A_content = '{:.2%}'.format(A)
    T_content = '{:.2%}'.format(T)
    C_content = '{:.2%}'.format(C)
    G_content = '{:.2%}'.format(G)
    return (gc_con,A_content,T_content,C_content,G_content)

#設(shè)置輸入使用argparse
parser = argparse.ArgumentParser()
parser.add_argument('--input', '-i',
                        type=str,
                        help='input file in fasta format')
args = parser.parse_args()

dict = read_fasta(args.input)
file_name = args.input.split('.')
name = file_name[0]
file_output = open("{}_sum.csv".format(name),'a')
file_output.write('name,length,GC content,A content,T content,C content,G content\n')
for val in dict:
    seq_info = get_info(dict[val])
    len_fasta = len(dict[val])
    print('******\n{0}\nlength:{1:d}\ngc content :{2}\nA content :{3}\nT content :{4}\nC content :{5}\nG content :{6}\n'.format(val,len_fasta,seq_info[0],seq_info[1],seq_info[2],seq_info[3],seq_info[4]))
    file_output.write('{0},{1},{2},{3},{4},{5},{6}\n'.format(val,len_fasta,seq_info[0],seq_info[1],seq_info[2],seq_info[3],seq_info[4]))
file_output.close()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末乓诽,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子咒程,更是在濱河造成了極大的恐慌问裕,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件孵坚,死亡現(xiàn)場(chǎng)離奇詭異粮宛,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)卖宠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)巍杈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人扛伍,你說(shuō)我怎么就攤上這事筷畦。” “怎么了刺洒?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵鳖宾,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我逆航,道長(zhǎng)鼎文,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任因俐,我火速辦了婚禮拇惋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘抹剩。我一直安慰自己撑帖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布澳眷。 她就那樣靜靜地躺著胡嘿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪钳踊。 梳的紋絲不亂的頭發(fā)上衷敌,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音箍土,去河邊找鬼逢享。 笑死罐监,一個(gè)胖子當(dāng)著我的面吹牛吴藻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播弓柱,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼沟堡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼侧但!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起航罗,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤禀横,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后粥血,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體柏锄,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年复亏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了趾娃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缔御,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情耐齐,我是刑警寧澤羡蛾,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站眷茁,受9級(jí)特大地震影響炕泳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜上祈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一喊崖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧雇逞,春花似錦荤懂、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至掉蔬,卻和暖如春廊宪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背女轿。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工箭启, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蛉迹。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓傅寡,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子荐操,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345