Как сопоставить два файла по переменным? - PullRequest
1 голос
/ 20 июня 2019

У меня есть два файла:

Тот, с которым выглядит вот так (я показываю только одну часть):

>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

Я хочу получить список с соответствующими последовательностями (буквы ... RKMQAATAATG ...) различных Uniref90_XXXXXXX. Я имею в виду, что для первой строки моего второго файла я должен получить список последовательностей для 4 Uniref90_XXXXXXX. Я не хочу сохранять символы «Uniref90_XXXXXXX» второго файла, только последовательности.

Краткий пример того, что мне нужно:

UniRef90_A0A0K2VG56 UniRef90_A0A0P5UY87

должен дать мне:

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

Возможно ли в Python это сделать?

Редактировать:

На данный момент я попытался создать словарь с идентификатором Uniref90_XXXXX в качестве ключей и соответствующими последовательностями в качестве значений.

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, а не все строки.

Ответы [ 2 ]

1 голос
/ 20 июня 2019

У меня есть маленькая функция для работы с последовательностями 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] было бы достаточно.

1 голос
/ 20 июня 2019

Вы можете построить dictionnay вот так, используя простой буфер (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

Полагаю, для вас все в порядке?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...