python input 文件名_教程:Python拆分基因筛选数据

0361515d59c319633e66e5539f7a047d.png

在科研过程中,我们通常要对大量实验数据文件进行拆分、拼接等操作,例如电池充放电循环、原位XRD数据等等。今天,谭编给大家分享利用Python编程对基因筛选数据文件进行拆分的编程教程。

前一段时间,一位本校生科院的同事寻求帮助:怎样将一个数据量很大的基因筛选数据文件拆分成单个的txt文本文件?

71c2fac896d33adf36f94e5e728421be.png

这些拆分的结果文件可能有成千上万个,采用Excel、Editplus(或Notepad)软件手动拆分,工作量非常大,也容易出错,因此手动操作已不现实,利用简单的python编程可以分分钟解决大问题!

1 程序功能介绍

1.1 功能要求

(1)将基因no_ex.cds.align.txt统计基因数、长度,并拆分为单独的TXT;

(2)TXT结果文件中第一行要填入基因数、长度,第二行以后抄写基因序列,并保留原基因序列数据(序列对齐,不能错位);

(3)每个结果TXT文件按照基因编号命名;

a8debe3fcb7119d83ffce00dbfa64e81.png

(4)同时处理筛选配置文件,修改其中与基因编号一致的*.aa、*.trees调用文件名和outfile文件名参数,最终同步生成与基因编号同名的codeml.ctl文件。

60b2e3d3e381cd0054d4462a66e35b35.png

为了适应不同的基因筛选实验数据的处理,python程序运行时,需要一个输入框,输入原数据文件名(例如no_ex.cds.align.txt),确定后,python程序就可以执行自动拆分操作了。

同时,为了每一次执行程序不会覆盖上一次执行操作的结果,python程序按照运行开始时间创建一个带时间信息的文件夹(例如:Gene20191122142文件夹),并将所有拆分.txt文件和同名配置文件.ctl输出保存在该文件夹下。

1.2 数据文件准备

将原数据文件(如no_ex.cds.align.txt和配置文件(如codeml.ctl)保存在程序目录下。

c2ccd95a65dd6548b2dc59809cab769d.png

为了运行时方便收入文件名,可以将no_ex.cds.align.txt改为简单文件名,如“g.txt”,本程序调试中谭编用的文件名为“genes.txt”,大家可以随意改为方便输入和记忆的文件名。

codeml.ctl是配置文件,不要更改文件名,程序将自动默认打开“codeml.ctl”配置文件,读取所有配置参数,修改其中的前3行参数中的.aa、.trees文件名以及outfile参数,并在程序拆分一段基因序列数据后,同名输出配置文件。codeml.ctl配置文件头部信息如下图所示。

0f15bdf6298f8de533c7ba1b9ff164ba.png

2 程序设计

2.1 程序环境

采用python3.6运行环境和pycharm编辑器编写程序。需要导入re、datetime库。

2.2 编程过程

2.2.1 配置与导包

在pycharm中新建align.py文件,并敲入以下代码:

1# -*- coding:utf-8 -*-
2
3import re
4import datetime

第一行是申明编码为utf-8,第3~4行是导入re和datetime库。

2.2.2 自定义函数 (1)文件夹创建函数

在拆分输出结果数据过程中,需要创建文件夹。

(左右滑动查看全部代码,下同)

 1def mkdir(path):
2    # 引入模块
3    import os
4    # 去除首位空格
5    path = path.strip()
6    # 去除尾部 \ 符号
7    path = path.rstrip("\\")
8    # 判断路径是否存在
9    isExists = os.path.exists(path)
10    # 判断结果
11    if not isExists:
12        # 如果不存在则创建目录
13        # 创建目录操作函数
14        os.makedirs(path)
15        return True
16    else:
17        # 如果目录存在则不创建,并提示目录已存在
18        return False

(2)输出文件函数

这里有两种输出方式:一是直接将所有内容保存到文件(savetotxt());二是将数据逐行追加到文件(appendtofile())。前者用于输出codeml.ctl文件(只是修改前3行参数,然后整体输出),后者是逐行读取原始数据,通过统计与分析后,将结果逐行追加到已建立的txt文件末尾。

 1def savetotxt(txtnm, txt, savepath):
2    path = savepath + '/' + txtnm
3    print(path)
4    try:
5        # mkdir(savepath)
6        with open(path, 'w+', encoding='gbk') as ftxt:
7            ftxt.writelines(txt)
8            print(path + ' was wrote successfully!')
9    except:
10        pass
11        print(path + ' was not wrote!')
12
13
14def appendtofile(txtnm, txt, savepath):
15    path = savepath + '/' + txtnm
16    try:
17        mkdir(savepath)
18        with open(path, 'a+', encoding='gbk') as ftxt:
19            ftxt.writelines(txt)
20            print(path + ' was wrote successfully!')
21    except:
22        pass
23        print(path + ' was not wrote!')
上述两个自定义函数中,都包含txtnm、txt、savepath三个参数,分别表示输出txt文件名、输出文本内容、保存路径。两个函数结果基本相似,涉及3个知识点: (a)保存文件路径字符串拼接 2path = savepath + '/' + txtnm

例如savepath为“Gene2019111007”,txtnm是基因编号命名的文件名“OG10925.txt”,这两者之间用“/”拼接,结果path的字符串如下:

Gene2019111007/OG10925.txt

(b)输出保存文件

6with open(path, 'w+', encoding='gbk') as ftxt: 7    ftxt.writelines(txt)

with open() as f1:这一句代码是打开一个文件,这种方式打开不用担心结束前,打开的文件是否已关闭,即免输入“f1.close()”,这个我们往往会忘记输入close()。有了with open()就不用担心这个了。

with open()中“w+”和“a+”分别是可写(write)和可加(append)两种写文件方式。下一行代码writelines(txt)是将txt变量中的字符串输出。

(c)纠错代码try:...except:...语法是尝试我们的程序,如果遇到意外(可能是bug也可能是原数据文件中的编码问题)自动跳过try执行except下的代码,让程序pass掉,否则程序如果遇到异常会终止运行。在开始编程过程中,可以不加try:...except:...,目的是遭遇bug,调试排除编程过程中因算法错误或输入错误导致的bug。
1    try:
2        # 正常执行的代码段
3    except:
4        pass
5        #异常执行的代码段

2.2.3 主程序

在编写主程序之前,一定要将所有用到的自定义函数编写在主程序入口代码之前,否则调用函数会出错。下面是主程序入口的代码:
 1if __name__ == '__main__':  # 程序的主入口
2    print(''' 3███████╗██████╗ ██╗     ██╗████████╗████████╗██╗  ██╗████████╗███████╗ 4██╔════╝██╔══██╗██║     ██║╚══██╔══╝╚══██╔══╝╚██╗██╔╝╚══██╔══╝██╔════╝ 5███████╗██████╔╝██║     ██║   ██║█████╗██║    ╚███╔╝    ██║   ███████╗ 6╚════██║██╔═══╝ ██║     ██║   ██║╚════╝██║    ██╔██╗    ██║   ╚════██║ 7███████║██║     ███████╗██║   ██║      ██║   ██╔╝ ██╗   ██║   ███████║ 8╚══════╝╚═╝     ╚══════╝╚═╝   ╚═╝      ╚═╝   ╚═╝  ╚═╝   ╚═╝   ╚══════╝ 910 功能介绍:将基因no_ex.cds.align.txt统计基因数、长度,并拆分为单独的TXT文件11 1.准备:将原数据文件(如no_ex.cds.align.txt和配置文件(如codeml.ctl)保存12        在程序目录下。13 2.运行:在python或pycharm中运行本程序,输入原数据文件名,确定。14 3.说明:数据处理结果自动保存在新建文件夹(如Gene20191121137)下。1516    ''')
17    datafile = input('''请输入align文件名(包括扩展名.txt):18    ''')

(1)主程序入口

第一行是固定格式,照抄就行,不能有错,name和main前后都是两个下划线,不能缺少和错误。特别注意:我们在输入程序代码时,有时候因为中文输入状态输入了中文冒号、中文逗号、中文引号、中文括号等等,肯定会出错!

(2)条件if语法

1#注意if else和其他模块(for循环、def定义函数等等)一样在行末以英文冒号结尾
2if x == 0:  #判断两者是否相等
3if x != 0:  #不等于
4if x > 0:   #大于0,x>=0是大于等于0
5if (line.find(">tmp") != -1):  #也可以将条件用括号括起来 
6    #这里是if满足是的代码,注意tab缩进
7else: 
8    #这里是否则的代码,注意tab缩进
9#退格到行首,不缩进,表示退出if else的模块,进入下一段顺序结构。

(3)输入框代码

在程序执行前,往往需要用户输入一些参数,例如本程序需要输入原始数据txt文件,我们需要对该文件进行操作。当然要确保输入的文件在程序文件当期文件夹下存在(事先准备好)。我们将input()获得的用户输入文本内容赋值给datafile变量,赋值语法是一个等号。

117    datafile = input('''请输入align文件名(包括扩展名.txt):218    ''')

(a)input(str)函数

input(str)函数让用户输入一个字符串,参数str是一个提示语,例如“请输入文件名:”

(b)python中的几种引号

python编程中有三种引号:单引号、双引号、三引号(三个单引号)。这种安排非常巧妙,我们在处理文本时,经常遇到处理的文本中也包含英文的双引号,为了避免语法错误,python让我们灵活避免引号的重复、套接错误。也就是说,如果字符串中有双引号,我们在用该字符串时,需要在两端用单引号;如果字符串中已经有单引号,我们就用双引号。

bb6a71f6ecadd40924e4aae85d64fcb9.png

对于三引号的用法,想必大家已经从上面的代码中看出端倪了!三引号所包含的字符串可以为段落(换行符),也就是可以换行。例如前面主程序入口,我们用到了换行的段落。

大家肯定会好奇主程序print输出的屏幕提示中,SPLIT-TXTs是怎么弄的,在下面这个网址,输入你想要的文本,即可生成asc艺术字。

http://patorjk.com/software/taag

(4)主程序中的部分代码

主程序中input()输入获得datafile数据文件名后,读取系统时间、拼接folder文件夹字符串、mkdir创建文件夹、读取codeml.ctl配置文件的全部内容,代码如下:

 1    start_time= datetime.datetime.now()
2
3    now = datetime.datetime.now()
4    folder = 'Gene{}{}{}{}{}'.format(now.year, now.month, now.day, now.hour, now.minute)
5    mkdir(folder)  # 以“Gene201911012114”为输出文件夹
6
7    # 读取codeml.ctl文件
8    with open("codeml.ctl", "r") as f_codeml:
9        codeml_content = f_codeml.read()
10
11    # ---------处理align数据文件---开始----------------------

限于篇幅,后续拆分基因原始数据的核心代码暂时省略。

程序的开发:费时、费脑、费头发!

若有需要本文源代码的读者,欢迎分享本文到朋友圈、打赏本文、添加谭编好友有偿索取。

若有需要定制其他python程序的读者,也欢迎添加谭编好友洽谈。

谭编微信:TAN-J-SCNU。拉群福利。

432034b8b1cf40b87bd937524eb835bf.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值