Python 如何根据变量匹配两个文件?
我有两个文件-其中一个看起来像这样(我只显示一部分): 第二个包含多行,仅由Uniref90_uuxxxxxx字符组成:Python 如何根据变量匹配两个文件?,python,file,Python,File,我有两个文件-其中一个看起来像这样(我只显示一部分): 第二个包含多行,仅由Uniref90_uuxxxxxx字符组成: UniRef90_A0A0K2VG56 UniRef90_A0A0P5UY87 UniRef90_A0A0V0H4B3 UniRef90_A0A132GS96 UniRef90_A0A095VQ09 UniRef90_A0A0C1UI80 UniRef90_A0A1M4ZSK2 UniRef90_A0A1W1CJV7 UniRef90_A0A1Z9J2X0 我想做的是得到一
UniRef90_A0A0K2VG56 UniRef90_A0A0P5UY87 UniRef90_A0A0V0H4B3 UniRef90_A0A132GS96
UniRef90_A0A095VQ09 UniRef90_A0A0C1UI80 UniRef90_A0A1M4ZSK2 UniRef90_A0A1W1CJV7 UniRef90_A0A1Z9J2X0
我想做的是得到一个列表,以及不同Uniref90_uuuxxxxxx的对应序列(字母…RKMQAATAATG…)
我的意思是,对于第二个文件的第一行,我应该得到4个Uniref90_uuxxxxxx的序列列表。我不想保留第二个文件的“Uniref90_uuxxxxxxx”字符,只保留序列
我需要的一个简短示例:
UniRef90_a0k2vg56 UniRef90_a0p5uy87
你应该给我:
MTTQAPTFTQPLQSVVVLEGSTATFEAHISGFPVPEVSWIRDGQVISTSTLPGVQISFSD
GRAKLTIPAVTKANSGRYSLRATNGSGQATSTAELLVKAETAPPNFVQRLQSMTVRQGSQ
VRLQVRVTGIPTPVVKFYRDGAEIQSSLDFQISQEGELYSLLIAEAYPEDSGTYSVNATN
SVGRATSTAELLVQGEEEVPAKKTKTIVSTAQISESRQTRIE ###UniRef90_A0A0K2VG56
VEMVIDGATGQQLPHKTPPRIPPKPKSRSPTPPSVAAKAQLGRQQSPSPIRHSPSPVRHV
RAPTPSPVRSVSPAGRISTSPIRSVKSPLLTRKMQAATAATGSEVPPPWKQESYMASSAE
AEMRETTMTSSTQIRREERWEGRYGVQE ###Uniref90_A0A0P5UY87
在Python中有可能做到这一点吗
编辑:
目前,我试图创建一个字典,其中Uniref90_uxxxxxid作为键,相应的序列作为值
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_uuuxxxxxxxID后添加第一行,而不是所有行。您可以使用简单的缓冲区(
current
此处)像这样构建词汇:
关于带有关键字的:
我想其余的都可以吗?我有一个处理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
您只需调整\u id=line.strip()[1://code>即可丢弃不需要的id行部分。我想\u id=line.strip()[1:][0]
就足够了。这是可能的。尝试…我想创建一个词汇表:我想创建带有行>UniRef90\u a0k2vg56-Cluster:titin
和相应序列作为值的键。然后,我将循环我的第一个文件,对于找到的每个Uniref90,我将把它与字典中相应的序列相匹配。应该可以吗?您需要尝试并提供您尝试的样本,然后如果您面临问题,我们将能够帮助您。。。我编辑了我的文章。你应该阅读这些行,直到你再次找到以“>”开头的行,例如使用while
循环,或者使用列表作为缓冲区……精确性:我使用的术语“buffer”是临时存储对象的通用术语,这里是一个简单的字符串(current
),它不是python类型。
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
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