我正在尝试组织包含多个序列的文件。在这样做时,我正在尝试将名称添加到列表中,并将序列添加到与名称列表并行的单独列表中。我想出了如何将名称添加到列表中,但我无法弄清楚如何将其后面的序列添加到单独的列表中。我尝试将序列行附加到空字符串中,但它将所有序列的所有行附加到单个字符串中。
所有名称都以'>'
开头def Name_Organizer(FASTA,output):
import os
import re
in_file=open(FASTA,'r')
dir,file=os.path.split(FASTA)
temp = os.path.join(dir,output)
out_file=open(temp,'w')
data=''
name_list=[]
for line in in_file:
line=line.strip()
for i in line:
if i=='>':
name_list.append(line)
break
else:
line=line.upper()
if all([k==k.upper() for k in line]):
data=data+line
print data
如何将序列作为一组字符串添加到列表中?
输入文件如下所示
答案 0 :(得分:4)
如果您正在使用Python& fasta文件,你可能想要研究安装BioPython.它已经包含了这个解析功能,还有更多。
解析fasta文件就像这样简单:
from Bio import SeqIO
for record in SeqIO.parse('filename.fasta', 'fasta'):
print record.id, record.seq
答案 1 :(得分:1)
点击标记线时需要重置字符串,如下所示:
def Name_Organizer(FASTA,output):
import os
import re
in_file=open(FASTA,'r')
dir,file=os.path.split(FASTA)
temp = os.path.join(dir,output)
out_file=open(temp,'w')
data=''
name_list=[]
seq_list=[]
for line in in_file:
line=line.strip()
for i in line:
if i=='>':
name_list.append(line)
if data:
seq_list.append(data)
data=''
break
else:
line=line.upper()
if all([k==k.upper() for k in line]):
data=data+line
print seq_list
当然,使用字符串加入而不是不断追加也可能更快(取决于文件的大小):
data = []
# ...
data.append(line) # repeatedly
# ...
seq_list.append(''.join(data)) # each time you get to a new marker line
data = []
答案 2 :(得分:0)
我先在字典中组织了
# remove white spaces from the lines
lines = [x.strip() for x in open(sys.argv[1]).readlines()]
fasta = {}
for line in lines:
if not line:
continue
# create the sequence name in the dict and a variable
if line.startswith('>'):
sname = line
if line not in fasta:
fasta[line] = ''
continue
# add the sequence to the last sequence name variable
fasta[sname] += line
# just to facilitate the input for my function
lst = list(fasta.values())