[笔记]python对FASTA文件的处理

这学期选了生信的选修课—perl/python在生物信息学中的应用
把结课作业的代码整理出来主要是python对FASTA文件的读取和数据处理

FASTA文件数据处理

FASTA文件读取:
只含一个基因序列
将FASTA文件的基因序列读取到一个列表中,列表中的每个元素为每一行基因序列构成的字符串
f=open('/home/miaoyr/perl_practice/test1_file/DTNBP1.fasta')
ls=[]
for line in f:
        if not line.startswith('>'):    
                ls.append(line.replace('\n',''))    #去掉行尾的换行符真的很重要!  
f.close()

含有多个序列信息
将数据保存在字典中,键为基因名,值为基因序列
f=open('/home/miaoyr/perl_practice/test4_file/3.fasta_seq.txt')
seq={}
for line in f:
        if line.startswith('>'):
                name=line.replace('>','').split()[0]
                seq[name]=''
        else:
                seq[name]+=line.replace('\n','').strip()
f.close()

碱基数目和序列长度统计:
上一步将基因序列写入列表,为了使用str.count()函数(使用对象为字符串)直接计算,将全部基因序列合并为一个字符串_str

A=C=T=G=0
_str=''
for i in range(0,len(ls)):
        _str+=ls[i]
print _str
A+=_str.count('A')
C+=_str.count('C')
T+=_str.count('T')
G+=_str.count('G')
print 'A:',A,'\n','C:',C,'\n','T:',T,'\n','G:',G,'\n'

输出互补序列:

 
  
f=open('/home/miaoyr/perl_practice/test4_file/3.fasta_seq.txt')
seq={}
complement={'A':'T','G':'C','C':'G','T':'A','\n':'\n'}
for line in f:
        if line.startswith('>'):
                name=line
                seq[name]=''
        else:
                line=line.lstrip()
                for i in line:
                        seq[name]+=complement[i]    #将互补序列存储到字典的值中
f.close()
_str=[]
l=open('4-5-output.txt','w')
for key in seq.keys():    #按fasta文件格式输出
        _str.append("%s%s\n"%(key,seq[key]))
l.writelines(_str)
l.close()
这个程序好像没有解决反向输出的问题。。
参考:seq[name][:-1]    没有试过不知道行不行ORZ


输出基因信息表中特定的基因信息

这里以本题为例:在基因的信息A文件中,找出B文件中存在的基因名的信息
文件B中只包含基因名,这里讲文件B按行读取,保存在一个列表中,列表中的每一个元素对应一个基因名
import os
get_name=[]
for _name in open('/home/miaoyr/perl_practice/test2_file/2.1name.txt'):
        get_name.append(_name.replace('\n',''))
print get_name
f=open('2-1-output.txt','w')
for name in get_name:
        m_name="'$3~/^"+name+"/ {print $0}'"
        cmd="'awk' %s '/home/miaoyr/perl_practice/test2_file/2.1Predicted_Targets_Info.txt'" % m_name
        output=os.popen(cmd).readlines()
        f.writelines(output)
f.close()

由于当时脑子抽了,想用shell语言(程序都是在linux上编写的)python的交互来写。。。
用了os.popen()函数实现和shell语言的awk命令交互,多此一举了。。
变量传递的时候遇到了很大的问题,最后用字符串解决的。
实现shell和python交互可用的函数主要由 os.popen()和os.system(),二者有一些区别。

python比较简单的方法思路:
将文件A按行读取,用split()函数分割。

遍历B文件中的基因名,通过pattern正则表达式,在文件A读取的行中查找符合条件的基因信息并输出。
问题:程序运行速度较慢,我也想不出更好的办法了QAQ
以本题为例:同样是 在基因的信息A文件中,找出B文件中存在的基因名的信息,这里用python直接处理。
get_id=[]
for _id in open('/home/miaoyr/perl_practice/test2_file/2.2gene_id'):
        get_id.append(_id.replace('\n',''))    #文件B中只包含基因名,直接将基因名按行读取,保存在一个列表中,每一个元素为一个基因名
info={}    #定义一个字典,键为基因名,值用于储存基因信息
for l in open('/home/miaoyr/perl_practice/test2_file/2.2gene_DE_info'):
        ls=l.replace('\n','').split('\t')    #文件A中含有多种信息,用split()分开储存
        name=ls[0]
        info[name]=ls[1]
        for _id in get_id:    #遍历文件B中的基因名找到匹配的键
                if _id==name:
                        print name,'\n',info[name]

简单的数据筛选可直接用linux命令实现
常用的包括 awk wc grep等

awk真的。。超级好用

以上题目对python的应用主要表现在
文件的读取和写入

输出格式化
一些库和函数的简单应用

我可能
还没有入门ORZ

猜你喜欢

转载自blog.csdn.net/cccrush/article/details/80112198