如何根据变量匹配两个文件?

2024-10-04 15:33:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个文件-其中一个看起来像这样(我只显示一部分):

>UniRef90_A0A0K2VG56 - Cluster: titin
MTTQAPTFTQPLQSVVALEGSAATFEAHVSGFPVPEVSWFRDGQVISTSTLPGVQISFSD
GRARLMIPAVTKANSGQYSLRATNGSGQATSTAELLVTAETAPPNFTQRLQSMTVRQGSQ
VRLQVRVTGIPTPVVKFYRDGAEIQSSLDFQISQEGELYSLLIAEAYPEDSGTYSVNATN
SVGRATSTAELLVQGEEVVPAKKTKTIVSTAQISETRQTRIEKKIEQKIEAHFDAKSIAT
VEMVIDGATGQQLPHKTPPRIPPKPKSRSPTPPSVAAKAQLGRQQSPSPIRHSPSPVRHV
>UniRef90_UPI00045E3C3E - Cluster: titin isoform X25
MTTQAPTFTQPLQSVVVLEGSTATFEAHISGFPVPEVSWIRDGQVISTSTLPGVQISFSD
GRAKLTIPAVTKANSGRYSLRATNGSGQATSTAELLVKAETAPPNFVQRLQSMTVRQGSQ
VRLQVRVTGIPTPVVKFYRDGAEIQSSLDFQISQEGELYSLLIAEAYPEDSGTYSVNATN
SVGRATSTAELLVQGEEEVPAKKTKTIVSTAQISESRQTRIEKKIEAHFDARSIATVEMV
IDGAAGQQLPHKTPPRIPPKPKSRSPTPPSIAAKAQLARQQSPSPIRHSPSPVRHVRAPT

第二个,有几行,仅由Uniref90\uxxxxxxx字符组成:

UniRef90_A0A0K2VG56 UniRef90_A0A0P5UY87 UniRef90_A0A0V0H4B3 UniRef90_A0A132GS96
UniRef90_A0A095VQ09 UniRef90_A0A0C1UI80 UniRef90_A0A1M4ZSK2 UniRef90_A0A1W1CJV7 UniRef90_A0A1Z9J2X0

我想做的是得到一个列表,以及不同Uniref90\uxxxxxxx的相应序列(字母…RKMQAATAATG…)

我的意思是,在我的第二个文件的第一行,我应该得到一个4 Uniref90\uxxxxxxx的序列列表。我不想保留第二个文件的“Uniref90\uxxxxxxx”字符,只保留序列

我需要一个简短的例子:

UniRef90_A0A0K2VG56 UniRef90_A0A0P5UY87

应该给我:

MTTQAPTFTQPLQSVVVLEGSTATFEAHISGFPVPEVSWIRDGQVISTSTLPGVQISFSD
GRAKLTIPAVTKANSGRYSLRATNGSGQATSTAELLVKAETAPPNFVQRLQSMTVRQGSQ
VRLQVRVTGIPTPVVKFYRDGAEIQSSLDFQISQEGELYSLLIAEAYPEDSGTYSVNATN
SVGRATSTAELLVQGEEEVPAKKTKTIVSTAQISESRQTRIE  ###UniRef90_A0A0K2VG56
VEMVIDGATGQQLPHKTPPRIPPKPKSRSPTPPSVAAKAQLGRQQSPSPIRHSPSPVRHV
RAPTPSPVRSVSPAGRISTSPIRSVKSPLLTRKMQAATAATGSEVPPPWKQESYMASSAE
AEMRETTMTSSTQIRREERWEGRYGVQE ###Uniref90_A0A0P5UY87

在Python中可以这样做吗

编辑:

目前,我尝试创建一个字典,Uniref90\uxxxxx 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\uxxxxxxx id后面的第一行,而不是所有行


Tags: 文件序列fastaf2clusteruniref90uxxxxxxxa0a0k2vg56
2条回答

您可以使用一个简单的缓冲区(current这里)像这样构建dictionnay:

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

About the with keyword: https://www.pythonforbeginners.com/files/with-statement-in-python

我想剩下的对你没问题吧

我有一个处理FASTA序列的小函数。它读取一个文件并输出一个序列的dict。它还处理空行和跨越多行的序列

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]就足够了

相关问题 更多 >

    热门问题