dict = {}
tag = ""
with open('/storage/emulated/0/Download/sequence.fasta.txt','r') as sequence:
seq = sequence.readlines()
for line in seq:
if line.startswith(">"):
tag = line.replace("\n", "")
else:
seq = "".join(seq[1:])
dict[tag] = seq.replace("\n", "")
print(dict)
那些不熟悉FASTA文件的人的背景。此格式包含一个或多个DNA、RNA或蛋白质序列,其中带有以">“开头的序列的一行描述标记,然后以以下行(Ex)中的序列开始。对于DNA来说,A、T、G和C会重复很多次。它还附带了许多不必要的换行符。到目前为止,当我每个文件只有一个序列时,这段代码可以工作,但是如果存在多个序列,它似乎忽略了if条件。例如,每当它注意到">“时,它都应该将每个新标记:序列对添加到字典中,但它只运行一次,并将第一个描述作为字典中的键,并加入文件的其余部分,而不考虑">”字符,并将其用作值。在第一次出现之后,如何让这个循环注意到一个新的">“?
我有意识地离开了生物工程模块。
发布于 2020-06-23 04:31:06
更新:下面的代码现在适用于多行序列。
下面的代码对我来说很好:
import re
from collections import defaultdict
sequences = defaultdict(str)
with open('fasta.txt') as f:
lines = f.readlines()
current_tag = None
for line in lines:
m = re.match('^>(.+)', line)
if m:
current_tag = m.group(1)
else:
sequences[current_tag] += line.strip()
for k, v in sequences.items():
print(f"{k}: {v}")
它使用了许多您可能不熟悉的特性,例如正则表达式(在生物信息学中可能非常有用)和f-字符串格式。如果有什么事情让你困惑,那就去问吧。我要补充的一点是,您不希望将变量定义为dict
,因为这将破坏Python在启动时定义的内容。我选择了sequences
,它不这样做,而且信息更丰富。
作为参考,这是我在这个实例中使用的示例FASTA文件fasta.txt
的内容:
>seq0
FQTWEEFSRAAEKLYLADPMKVRVVLKYRHVDGNLCIKVTDDLVCLVYRTDQAQDVKKIEKF
>seq1
KYRTWEEFTRAAEKLYQADPMKVRVVLKYRHCDGNLCIKVTDDVVCLLYRTDQAQDVKKIEKFHSQLMRLME LKVTDNKECLKFKTDQAQEAKKMEKLNNIFFTLM
>seq2
EEYQTWEEFARAAEKLYLTDPMKVRVVLKYRHCDGNLCMKVTDDAVCLQYKTDQAQDVKKVEKLHGK
>seq3
MYQVWEEFSRAVEKLYLTDPMKVRVVLKYRHCDGNLCIKVTDNSVCLQYKTDQAQDVK
>seq4
EEFSRAVEKLYLTDPMKVRVVLKYRHCDGNLCIKVTDNSVVSYEMRLFGVQKDNFALEHSLL
>seq5
SWEEFAKAAEVLYLEDPMKCRMCTKYRHVDHKLVVKLTDNHTVLKYVTDMAQDVKKIEKLTTLLMR
>seq6
FTNWEEFAKAAERLHSANPEKCRFVTKYNHTKGELVLKLTDDVVCLQYSTNQLQDVKKLEKLSSTLLRSI
>seq7
SWEEFVERSVQLFRGDPNATRYVMKYRHCEGKLVLKVTDDRECLKFKTDQAQDAKKMEKLNNIFF
>seq8
SWDEFVDRSVQLFRADPESTRYVMKYRHCDGKLVLKVTDNKECLKFKTDQAQEAKKMEKLNNIFFTLM
>seq9
KNWEDFEIAAENMYMANPQNCRYTMKYVHSKGHILLKMSDNVKCVQYRAENMPDLKK
>seq10
FDSWDEFVSKSVELFRNHPDTTRYVVKYRHCEGKLVLKVTDNHECLKFKTDQAQDAKKMEK
https://stackoverflow.com/questions/62534586
复制