我有两个文件:
一个看起来像这样的东西(我只显示一部分):
>UniRef90_A0A0K2VG56 - Cluster: titin
MTTQAPTFTQPLQSVVALEGSAATFEAHVSGFPVPEVSWFRDGQVISTSTLPGVQISFSD
GRARLMIPAVTKANSGQYSLRATNGSGQATSTAELLVTAETAPPNFTQRLQSMTVRQGSQ
VRLQVRVTGIPTPVVKFYRDGAEIQSSLDFQISQEGELYSLLIAEAYPEDSGTYSVNATN
SVGRATSTAELLVQGEEVVPAKKTKTIVSTAQISETRQTRIEKKIEQKIEAHFDAKSIAT
VEMVIDGATGQQLPHKTPPRIPPKPKSRSPTPPSVAAKAQLGRQQSPSPIRHSPSPVRHV
>UniRef90_UPI00045E3C3E - Cluster: titin isoform X25
MTTQAPTFTQPLQSVVVLEGSTATFEAHISGFPVPEVSWIRDGQVISTSTLPGVQISFSD
GRAKLTIPAVTKANSGRYSLRATNGSGQATSTAELLVKAETAPPNFVQRLQSMTVRQGSQ
VRLQVRVTGIPTPVVKFYRDGAEIQSSLDFQISQEGELYSLLIAEAYPEDSGTYSVNATN
SVGRATSTAELLVQGEEEVPAKKTKTIVSTAQISESRQTRIEKKIEAHFDARSIATVEMV
IDGAAGQQLPHKTPPRIPPKPKSRSPTPPSIAAKAQLARQQSPSPIRHSPSPVRHVRAPT
第二行只有几行,仅由Uniref90_XXXXXXX字符组成:
UniRef90_A0A0K2VG56 UniRef90_A0A0P5UY87 UniRef90_A0A0V0H4B3 UniRef90_A0A132GS96
UniRef90_A0A095VQ09 UniRef90_A0A0C1UI80 UniRef90_A0A1M4ZSK2 UniRef90_A0A1W1CJV7 UniRef90_A0A1Z9J2X0
我想要做的是获取一个列表,其中包含不同Uniref90_XXXXXXX的相应序列(字母... RKMQAATAATG ...)。 我的意思是,对于第二个文件的第一行,我应该获得4 Uniref90_XXXXXXX的序列的列表。我不想保留第二个文件的“ Uniref90_XXXXXXX”字符,仅保留序列。
我需要的简短示例:
UniRef90_A0A0K2VG56 UniRef90_A0A0P5UY87
应该给我:
MTTQAPTFTQPLQSVVVLEGSTATFEAHISGFPVPEVSWIRDGQVISTSTLPGVQISFSD
GRAKLTIPAVTKANSGRYSLRATNGSGQATSTAELLVKAETAPPNFVQRLQSMTVRQGSQ
VRLQVRVTGIPTPVVKFYRDGAEIQSSLDFQISQEGELYSLLIAEAYPEDSGTYSVNATN
SVGRATSTAELLVQGEEEVPAKKTKTIVSTAQISESRQTRIE ###UniRef90_A0A0K2VG56
VEMVIDGATGQQLPHKTPPRIPPKPKSRSPTPPSVAAKAQLGRQQSPSPIRHSPSPVRHV
RAPTPSPVRSVSPAGRISTSPIRSVKSPLLTRKMQAATAATGSEVPPPWKQESYMASSAE
AEMRETTMTSSTQIRREERWEGRYGVQE ###Uniref90_A0A0P5UY87
在Python中可以做到这一点吗?
编辑:
目前,我试图创建一个字典,其中Uniref90_XXXXX id为键,相应的序列为值。
f2=open("~/PROJET_M2/data/uniref90.fasta", "r")
fasta={}
for i in f2:
i=i.rstrip("\n")
if i.startswith(">"):
l=next(f2,'').strip() ### the problem is there I guess
i=i[1:]
i=i.split(" ")
fasta[i[0]]=l
print(fasta)
这是行不通的,我的意思是,密钥创建得很好,但是正如您在第一个文件中看到的那样,有几行。该代码仅在Uniref90_XXXXXXX ID之后添加第一行,而不是在所有行之后添加。
答案 0 :(得分:1)
您可以使用一个简单的缓冲区(此处为current
)来构建这样的字典:
with open("/path/to/file", "r") as f1:
result, current_id, current = {}, None, ""
for l in f1:
print(l)
if l[0] == ">":
if current_id:
result[current_id] = current
current_id = l[1:].strip()
current = ""
else:
current += l.strip()
result[current_id] = current
关于
with
关键字:https://www.pythonforbeginners.com/files/with-statement-in-python
我认为剩下的一切都可以吗?
答案 1 :(得分:1)
我有这个小功能来处理FASTA序列。它读取文件并输出序列字典。它也处理空行和跨越多行的序列。
def parse_fasta(fasta_file):
'''file_path => dict
Return a dict of id:sequence pairs.
'''
d = {}
_id = False
seq = ''
with open(fasta_file,'r') as f:
for line in f:
if line.startswith('\n'):
continue
if line.startswith('>'):
if not _id:
_id = line.strip()[1:]
elif _id and seq:
d.update({_id:seq})
_id = line.strip()[1:]
seq = ''
else:
seq += line.strip()
d.update({_id:seq})
return d
您只需要调整_id = line.strip()[1:]
即可丢弃不需要的部分ID行。我猜_id = line.strip()[1:].split()[0]
就足够了。