教程:Python拆分基因篩選數(shù)據(jù)
在科研過程中,我們通常要對大量實驗數(shù)據(jù)文件進行拆分、拼接等操作,例如電池充放電循環(huán)、原位XRD數(shù)據(jù)等等。今天,譚編給大家分享利用Python編程對基因篩選數(shù)據(jù)文件進行拆分的編程教程。
前一段時間,一位本校生科院的同事尋求幫助:怎樣將一個數(shù)據(jù)量很大的基因篩選數(shù)據(jù)文件拆分成單個的txt文本文件?

這些拆分的結(jié)果文件可能有成千上萬個,采用Excel、Editplus(或Notepad)軟件手動拆分,工作量非常大,也容易出錯,因此手動操作已不現(xiàn)實,利用簡單的python編程可以分分鐘解決大問題!
1 程序功能介紹
1.1 功能要求
(1)將基因no_ex.cds.align.txt統(tǒng)計基因數(shù)、長度,并拆分為單獨的TXT;
(2)TXT結(jié)果文件中第一行要填入基因數(shù)、長度,第二行以后抄寫基因序列,并保留原基因序列數(shù)據(jù)(序列對齊,不能錯位);
(3)每個結(jié)果TXT文件按照基因編號命名;

(4)同時處理篩選配置文件,修改其中與基因編號一致的*.aa、*.trees調(diào)用文件名和outfile文件名參數(shù),最終同步生成與基因編號同名的codeml.ctl文件。

為了適應(yīng)不同的基因篩選實驗數(shù)據(jù)的處理,python程序運行時,需要一個輸入框,輸入原數(shù)據(jù)文件名(例如no_ex.cds.align.txt),確定后,python程序就可以執(zhí)行自動拆分操作了。
同時,為了每一次執(zhí)行程序不會覆蓋上一次執(zhí)行操作的結(jié)果,python程序按照運行開始時間創(chuàng)建一個帶時間信息的文件夾(例如:Gene20191122142文件夾),并將所有拆分.txt文件和同名配置文件.ctl輸出保存在該文件夾下。
1.2數(shù)據(jù)文件準(zhǔn)備
將原數(shù)據(jù)文件(如no_ex.cds.align.txt和配置文件(如codeml.ctl)保存在程序目錄下。

為了運行時方便收入文件名,可以將no_ex.cds.align.txt改為簡單文件名,如“g.txt”,本程序調(diào)試中譚編用的文件名為“genes.txt”,大家可以隨意改為方便輸入和記憶的文件名。
codeml.ctl是配置文件,不要更改文件名,程序?qū)⒆詣幽J打開“codeml.ctl”配置文件,讀取所有配置參數(shù),修改其中的前3行參數(shù)中的.aa、.trees文件名以及outfile參數(shù),并在程序拆分一段基因序列數(shù)據(jù)后,同名輸出配置文件。codeml.ctl配置文件頭部信息如下圖所示。

2程序設(shè)計
2.1程序環(huán)境
采用python3.6運行環(huán)境和pycharm編輯器編寫程序。需要導(dǎo)入re、datetime庫。
2.2編程過程
2.2.1配置與導(dǎo)包
在pycharm中新建align.py文件,并敲入以下代碼:
1#-*-coding:utf-8-*-
2
3importre
4importdatetime
第一行是申明編碼為utf-8,第3~4行是導(dǎo)入re和datetime庫。
在拆分輸出結(jié)果數(shù)據(jù)過程中,需要創(chuàng)建文件夾。
(左右滑動查看全部代碼,下同)
1defmkdir(path):
2#引入模塊
3importos
4#去除首位空格
5path=path.strip()
6#去除尾部符號
7path=path.rstrip("")
8#判斷路徑是否存在
9isExists=os.path.exists(path)
10#判斷結(jié)果
11ifnotisExists:
12#如果不存在則創(chuàng)建目錄
13#創(chuàng)建目錄操作函數(shù)
14os.makedirs(path)
15returnTrue
16else:
17#如果目錄存在則不創(chuàng)建,并提示目錄已存在
18returnFalse
(2)輸出文件函數(shù)
這里有兩種輸出方式:一是直接將所有內(nèi)容保存到文件(savetotxt());二是將數(shù)據(jù)逐行追加到文件(appendtofile())。前者用于輸出codeml.ctl文件(只是修改前3行參數(shù),然后整體輸出),后者是逐行讀取原始數(shù)據(jù),通過統(tǒng)計與分析后,將結(jié)果逐行追加到已建立的txt文件末尾。
1defsavetotxt(txtnm,txt,savepath):
2path=savepath+'/'+txtnm
3print(path)
4try:
5#mkdir(savepath)
6withopen(path,'w+',encoding='gbk')asftxt:
7ftxt.writelines(txt)
8print(path+'waswrotesuccessfully!')
9except:
10pass
11print(path+'wasnotwrote!')
12
13
14defappendtofile(txtnm,txt,savepath):
15path=savepath+'/'+txtnm
16try:
17mkdir(savepath)
18withopen(path,'a+',encoding='gbk')asftxt:
19ftxt.writelines(txt)
20print(path+'waswrotesuccessfully!')
21except:
22pass
23print(path+'wasnotwrote!')
例如savepath為“Gene2019111007”,txtnm是基因編號命名的文件名“OG10925.txt”,這兩者之間用“/”拼接,結(jié)果path的字符串如下:
Gene2019111007/OG10925.txt
(b)輸出保存文件
6withopen(path,'w+',encoding='gbk')asftxt:
7 ftxt.writelines(txt)
with open() as f1:這一句代碼是打開一個文件,這種方式打開不用擔(dān)心結(jié)束前,打開的文件是否已關(guān)閉,即免輸入“f1.close()”,這個我們往往會忘記輸入close()。有了with open()就不用擔(dān)心這個了。
with open()中“w+”和“a+”分別是可寫(write)和可加(append)兩種寫文件方式。下一行代碼writelines(txt)是將txt變量中的字符串輸出。
1try:
2#正常執(zhí)行的代碼段
3except:
4pass
5#異常執(zhí)行的代碼段
2.2.3 主程序
1if__name__=='__main__':#程序的主入口
2print('''
3███████╗██████╗██╗██╗████████╗████████╗██╗██╗████████╗███████╗
4██╔════╝██╔══██╗██║██║╚══██╔══╝╚══██╔══╝╚██╗██╔╝╚══██╔══╝██╔════╝
5███████╗██████╔╝██║██║██║█████╗██║╚███╔╝██║███████╗
6╚════██║██╔═══╝██║██║██║╚════╝██║██╔██╗██║╚════██║
7███████║██║███████╗██║██║██║██╔╝██╗██║███████║
8╚══════╝╚═╝╚══════╝╚═╝╚═╝╚═╝╚═╝╚═╝╚═╝╚══════╝
9
10功能介紹:將基因no_ex.cds.align.txt統(tǒng)計基因數(shù)、長度,并拆分為單獨的TXT文件
111.準(zhǔn)備:將原數(shù)據(jù)文件(如no_ex.cds.align.txt和配置文件(如codeml.ctl)保存
12在程序目錄下。
132.運行:在python或pycharm中運行本程序,輸入原數(shù)據(jù)文件名,確定。
143.說明:數(shù)據(jù)處理結(jié)果自動保存在新建文件夾(如Gene20191121137)下。
15
16''')
17datafile=input('''請輸入align文件名(包括擴展名.txt):
18''')
(1)主程序入口
第一行是固定格式,照抄就行,不能有錯,name和main前后都是兩個下劃線,不能缺少和錯誤。特別注意:我們在輸入程序代碼時,有時候因為中文輸入狀態(tài)輸入了中文冒號、中文逗號、中文引號、中文括號等等,肯定會出錯!
(2)條件if語法
1#注意ifelse和其他模塊(for循環(huán)、def定義函數(shù)等等)一樣在行末以英文冒號結(jié)尾
2ifx==0:#判斷兩者是否相等
3ifx!=0:#不等于
4ifx>0:#大于0,x>=0是大于等于0
5if(line.find(">tmp")!=-1):#也可以將條件用括號括起來
6#這里是if滿足是的代碼,注意tab縮進
7else:
8#這里是否則的代碼,注意tab縮進
9#退格到行首,不縮進,表示退出if else的模塊,進入下一段順序結(jié)構(gòu)。
(3)輸入框代碼
在程序執(zhí)行前,往往需要用戶輸入一些參數(shù),例如本程序需要輸入原始數(shù)據(jù)txt文件,我們需要對該文件進行操作。當(dāng)然要確保輸入的文件在程序文件當(dāng)期文件夾下存在(事先準(zhǔn)備好)。我們將input()獲得的用戶輸入文本內(nèi)容賦值給datafile變量,賦值語法是一個等號。
117datafile=input('''請輸入align文件名(包括擴展名.txt):
218''')
(a)input(str)函數(shù)
input(str)函數(shù)讓用戶輸入一個字符串,參數(shù)str是一個提示語,例如“請輸入文件名:”
(b)python中的幾種引號
python編程中有三種引號:單引號、雙引號、三引號(三個單引號)。這種安排非常巧妙,我們在處理文本時,經(jīng)常遇到處理的文本中也包含英文的雙引號,為了避免語法錯誤,python讓我們靈活避免引號的重復(fù)、套接錯誤。也就是說,如果字符串中有雙引號,我們在用該字符串時,需要在兩端用單引號;如果字符串中已經(jīng)有單引號,我們就用雙引號。

對于三引號的用法,想必大家已經(jīng)從上面的代碼中看出端倪了!三引號所包含的字符串可以為段落(換行符),也就是可以換行。例如前面主程序入口,我們用到了換行的段落。
大家肯定會好奇主程序print輸出的屏幕提示中,SPLIT-TXTs是怎么弄的,在下面這個網(wǎng)址,輸入你想要的文本,即可生成asc藝術(shù)字。
http://patorjk.com/software/taag
(4)主程序中的部分代碼
主程序中input()輸入獲得datafile數(shù)據(jù)文件名后,讀取系統(tǒng)時間、拼接folder文件夾字符串、mkdir創(chuàng)建文件夾、讀取codeml.ctl配置文件的全部內(nèi)容,代碼如下:
1start_time=datetime.datetime.now()
2
3now=datetime.datetime.now()
4folder='Gene{}{}{}{}{}'.format(now.year,now.month,now.day,now.hour,now.minute)
5mkdir(folder)#以“Gene201911012114”為輸出文件夾
6
7#讀取codeml.ctl文件
8withopen("codeml.ctl","r")asf_codeml:
9codeml_content=f_codeml.read()
10
11#---------處理align數(shù)據(jù)文件---開始----------------------
限于篇幅,后續(xù)拆分基因原始數(shù)據(jù)的核心代碼暫時省略。
-
Origin(Pro):學(xué)習(xí)版的窗口限制【數(shù)據(jù)繪圖】 2020-08-07
-
如何卸載Aspen Plus并再重新安裝,這篇文章告訴你! 2020-05-29
-
CAD視口的邊框線看不到也選不中是怎么回事,怎么解決? 2020-06-04
-
教程 | Origin從DSC計算焓和比熱容 2020-08-31
-
Aspen Plus安裝過程中RMS License證書安裝失敗的解決方法,親測有效! 2021-10-15
-
CAD外部參照無法綁定怎么辦? 2020-06-03
-
CAD中如何將布局連帶視口中的內(nèi)容復(fù)制到另一張圖中? 2020-07-03
