教程:Python拆分基因筛选数据
在科研过程中,我们通常要对大量实验数据文件进行拆分、拼接等操作,例如电池充放电循环、原位XRD数据等等。今天,谭编给大家分享利用Python编程对基因筛选数据文件进行拆分的编程教程。
前一段时间,一位本校生科院的同事寻求帮助:怎样将一个数据量很大的基因筛选数据文件拆分成单个的txt文本文件?
这些拆分的结果文件可能有成千上万个,采用Excel、Editplus(或Notepad)软件手动拆分,工作量非常大,也容易出错,因此手动操作已不现实,利用简单的python编程可以分分钟解决大问题!
1 程序功能介绍
1.1 功能要求
(1)将基因no_ex.cds.align.txt统计基因数、长度,并拆分为单独的TXT;
(2)TXT结果文件中第一行要填入基因数、长度,第二行以后抄写基因序列,并保留原基因序列数据(序列对齐,不能错位);
(3)每个结果TXT文件按照基因编号命名;
(4)同时处理筛选配置文件,修改其中与基因编号一致的*.aa、*.trees调用文件名和outfile文件名参数,最终同步生成与基因编号同名的codeml.ctl文件。
为了适应不同的基因筛选实验数据的处理,python程序运行时,需要一个输入框,输入原数据文件名(例如no_ex.cds.align.txt),确定后,python程序就可以执行自动拆分操作了。
同时,为了每一次执行程序不会覆盖上一次执行操作的结果,python程序按照运行开始时间创建一个带时间信息的文件夹(例如:Gene20191122142文件夹),并将所有拆分.txt文件和同名配置文件.ctl输出保存在该文件夹下。
1.2数据文件准备
将原数据文件(如no_ex.cds.align.txt和配置文件(如codeml.ctl)保存在程序目录下。
为了运行时方便收入文件名,可以将no_ex.cds.align.txt改为简单文件名,如“g.txt”,本程序调试中谭编用的文件名为“genes.txt”,大家可以随意改为方便输入和记忆的文件名。
codeml.ctl是配置文件,不要更改文件名,程序将自动默认打开“codeml.ctl”配置文件,读取所有配置参数,修改其中的前3行参数中的.aa、.trees文件名以及outfile参数,并在程序拆分一段基因序列数据后,同名输出配置文件。codeml.ctl配置文件头部信息如下图所示。
2程序设计
2.1程序环境
采用python3.6运行环境和pycharm编辑器编写程序。需要导入re、datetime库。
2.2编程过程
2.2.1配置与导包
在pycharm中新建align.py文件,并敲入以下代码:
1#-*-coding:utf-8-*-
2
3importre
4importdatetime
第一行是申明编码为utf-8,第3~4行是导入re和datetime库。
在拆分输出结果数据过程中,需要创建文件夹。
(左右滑动查看全部代码,下同)
1defmkdir(path):
2#引入模块
3importos
4#去除首位空格
5path=path.strip()
6#去除尾部符号
7path=path.rstrip("")
8#判断路径是否存在
9isExists=os.path.exists(path)
10#判断结果
11ifnotisExists:
12#如果不存在则创建目录
13#创建目录操作函数
14os.makedirs(path)
15returnTrue
16else:
17#如果目录存在则不创建,并提示目录已存在
18returnFalse
(2)输出文件函数
这里有两种输出方式:一是直接将所有内容保存到文件(savetotxt());二是将数据逐行追加到文件(appendtofile())。前者用于输出codeml.ctl文件(只是修改前3行参数,然后整体输出),后者是逐行读取原始数据,通过统计与分析后,将结果逐行追加到已建立的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”,这两者之间用“/”拼接,结果path的字符串如下:
Gene2019111007/OG10925.txt
(b)输出保存文件
6withopen(path,'w+',encoding='gbk')asftxt:
7 ftxt.writelines(txt)
with open() as f1:这一句代码是打开一个文件,这种方式打开不用担心结束前,打开的文件是否已关闭,即免输入“f1.close()”,这个我们往往会忘记输入close()。有了with open()就不用担心这个了。
with open()中“w+”和“a+”分别是可写(write)和可加(append)两种写文件方式。下一行代码writelines(txt)是将txt变量中的字符串输出。
1try:
2#正常执行的代码段
3except:
4pass
5#异常执行的代码段
2.2.3 主程序
1if__name__=='__main__':#程序的主入口
2print('''
3███████╗██████╗██╗██╗████████╗████████╗██╗██╗████████╗███████╗
4██╔════╝██╔══██╗██║██║╚══██╔══╝╚══██╔══╝╚██╗██╔╝╚══██╔══╝██╔════╝
5███████╗██████╔╝██║██║██║█████╗██║╚███╔╝██║███████╗
6╚════██║██╔═══╝██║██║██║╚════╝██║██╔██╗██║╚════██║
7███████║██║███████╗██║██║██║██╔╝██╗██║███████║
8╚══════╝╚═╝╚══════╝╚═╝╚═╝╚═╝╚═╝╚═╝╚═╝╚══════╝
9
10功能介绍:将基因no_ex.cds.align.txt统计基因数、长度,并拆分为单独的TXT文件
111.准备:将原数据文件(如no_ex.cds.align.txt和配置文件(如codeml.ctl)保存
12在程序目录下。
132.运行:在python或pycharm中运行本程序,输入原数据文件名,确定。
143.说明:数据处理结果自动保存在新建文件夹(如Gene20191121137)下。
15
16''')
17datafile=input('''请输入align文件名(包括扩展名.txt):
18''')
(1)主程序入口
第一行是固定格式,照抄就行,不能有错,name和main前后都是两个下划线,不能缺少和错误。特别注意:我们在输入程序代码时,有时候因为中文输入状态输入了中文冒号、中文逗号、中文引号、中文括号等等,肯定会出错!
(2)条件if语法
1#注意ifelse和其他模块(for循环、def定义函数等等)一样在行末以英文冒号结尾
2ifx==0:#判断两者是否相等
3ifx!=0:#不等于
4ifx>0:#大于0,x>=0是大于等于0
5if(line.find(">tmp")!=-1):#也可以将条件用括号括起来
6#这里是if满足是的代码,注意tab缩进
7else:
8#这里是否则的代码,注意tab缩进
9#退格到行首,不缩进,表示退出if else的模块,进入下一段顺序结构。
(3)输入框代码
在程序执行前,往往需要用户输入一些参数,例如本程序需要输入原始数据txt文件,我们需要对该文件进行操作。当然要确保输入的文件在程序文件当期文件夹下存在(事先准备好)。我们将input()获得的用户输入文本内容赋值给datafile变量,赋值语法是一个等号。
117datafile=input('''请输入align文件名(包括扩展名.txt):
218''')
(a)input(str)函数
input(str)函数让用户输入一个字符串,参数str是一个提示语,例如“请输入文件名:”
(b)python中的几种引号
python编程中有三种引号:单引号、双引号、三引号(三个单引号)。这种安排非常巧妙,我们在处理文本时,经常遇到处理的文本中也包含英文的双引号,为了避免语法错误,python让我们灵活避免引号的重复、套接错误。也就是说,如果字符串中有双引号,我们在用该字符串时,需要在两端用单引号;如果字符串中已经有单引号,我们就用双引号。
对于三引号的用法,想必大家已经从上面的代码中看出端倪了!三引号所包含的字符串可以为段落(换行符),也就是可以换行。例如前面主程序入口,我们用到了换行的段落。
大家肯定会好奇主程序print输出的屏幕提示中,SPLIT-TXTs是怎么弄的,在下面这个网址,输入你想要的文本,即可生成asc艺术字。
http://patorjk.com/software/taag
(4)主程序中的部分代码
主程序中input()输入获得datafile数据文件名后,读取系统时间、拼接folder文件夹字符串、mkdir创建文件夹、读取codeml.ctl配置文件的全部内容,代码如下:
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数据文件---开始----------------------
限于篇幅,后续拆分基因原始数据的核心代码暂时省略。
-
Origin(Pro):学习版的窗口限制【数据绘图】 2020-08-07
-
如何卸载Aspen Plus并再重新安装,这篇文章告诉你! 2020-05-29
-
AutoCAD 保存时出现错误:“此图形中的一个或多个对象无法保存为指定格式”怎么办? 2020-08-03
-
OriginPro:学习版申请及过期激活方法【数据绘图】 2020-08-06
-
CAD视口的边框线看不到也选不中是怎么回事,怎么解决? 2020-06-04
-
教程 | Origin从DSC计算焓和比热容 2020-08-31
-
如何评价拟合效果-Origin(Pro)数据拟合系列教程【数据绘图】 2020-08-06
-
Aspen Plus安装过程中RMS License证书安装失败的解决方法,亲测有效! 2021-10-15
-
CAD外部参照无法绑定怎么办? 2020-06-03
-
CAD中如何将布局连带视口中的内容复制到另一张图中? 2020-07-03