我正在使用fasta格式的DNA序列数据,需要创建2个包含生物体名称和序列的列表。我遇到了以下帖子Add multiple sequences from a FASTA file to a list in python,但解决方案对我来说无法正常工作(我还无法发表评论)。
fasta文件是使用以下格式的txt文件。一行以“>”开头标记有机体名称,然后是带有序列数据的多行。一个fasta文件可以包含多个生物体,每个生物体都按块组织:
> Organism1
ACTGATGACTGATCGTACGT
ATCGATCGTAGCTACGATCG
ATCATGCTATTGTG
> Organism2
TACTGTAGCTAGTCGTAGCT
ATGACGATCGTACGTCGTAC
TAGCTGACTG
...
我在上述链接的帮助下编写的代码是:
data_file = open("multitest.fas","r")
data_tmp = []
a=[] #list for organisms name
b=[] #list for sequence data
for line in data_file:
line = line.rstrip()
line = line.strip("\n").strip("\r")
for i in line:
if line[0] == ">":
a.append(line[1:])
if data_tmp:
b.append("".join(data_tmp))
data_tmp=[]
break
else:
line=line.upper()
if all([k==k.upper() for k in line]):
data_tmp.append(line)
print a
print b
代码工作正常,除了最后一个有机体的序列没有附加到列表b。这似乎是显而易见的,因为序列数据仅在“>”时添加遇到了。如何确保添加最后一个序列?为什么没有其他人在上述链接的代码中遇到同样的问题?谢谢你的建议!
答案 0 :(得分:0)
我用Regex完成了它。希望你觉得它有用。
>>> import re
>>> data_file = open("multitest.fas","r")
>>> data=data_file.read()
>>> org=re.findall(r'>(\w*)',data)
>>> org
['Organism1', 'Organism2']
>>> seq=[i.replace('\n','') for i in re.split(r'>\w*',data,re.DOTALL)[1:]]
>>> seq
['ACTGATGACTGATCGTACGTATCGATCGTAGCTACGATCGATCATGCTATTGTG', 'TACTGTAGCTAGTCGTAGCTATGACGATCGTACGTCGTACTAGCTGACTG']