Как напечатать строки после матча с питоном? - PullRequest
0 голосов
/ 20 июня 2019

У меня есть файл с несколькими строками (я показываю только две из них):

UniRef90_A0A0K2VG56 UniRef90_A0A0P5UY87 
UniRef90_A0A095VQ09 UniRef90_A0A0C1UI80 UniRef90_A0A1M4ZSK2

и другой файл (я показываю только некоторые строки файла):

>UniRef90_A0A095VQ09 - Cluster: LOW QUALITY PROTEIN: titin
MTTKAPTFTQPLQSVVALEGSAATFEAHISGSPVPEVSWYRDGQVLSAATLPGVQISFSD
GRAKLMIPAVAAGHSGRYTLQATNGSGQATSTAELLVTAETAPPNFSQRLQSTTARQGSQ
VRLDVRVTGIPTPVVKFYRDRAEIQSSPDFQILQEGDLYSLIIAEAYPEDSGTYSVNATN
>UniRef90_A0A0K2VG56 - Cluster: titin isoform X29
MATQAPTFTQPLQSVVVLEGSTATFEAHISGFPVPEVSWFRDGQVISTSTLPGVQISFSD
GRAKLMIPAVTKANSGRYSLRATNGSGQATSTAELLVKAETAPPNFVQRLQSMTVRQGSQ
VRLQVRVTGIPTPVVKFYRDGAEIQSSLDFQISQEGELYSLLIVEAYPEDSGTYSVNATN
SVGRATSTAELLVQGEEVVPAKKTKTIVSTAQISKSRETRIEKKIEAHFDARSIATVEMV
IDGAAGQELPHKTPPRIPLKPKSRSPTPPSIAAKAQLARQQSPSPIRHSPSPVRHVRAPT
>UniRef90_A0A0C1UI80 - Cluster: LOW QUALITY PROTEIN: lafev
GRAKLMIPAVTKANSGRYSLRATNGSGQATSTAELLVKAETAPPNFVQRLQSMTVRQGSQ
VRLQVRVTGIPTPVVKFYRDGAEIQSSLDFQISQEGLARQQSPSPIRHSPSPVRHVRAPT
>UniRef90_A0A0P5UY87 - Cluster: titin isoform X4
VRLQVRVTGIPTPVVKFYRDGAEIQSSLDFQISQEGELYSLLIVEAYPEDSGTYSVNATN
SVGRATSTAELLVQGEEVVPAKKTKTIVSTAQISKSRETRIEKKIEAHFDARSIATVEMV
GRAKLMIPAVAAGHSGRYTLQATNGSGQATSTAELLVTAETAPPNFSQRLQSTTARQGSQ
>UniRef90_A0A1M4ZSK2  - Cluster: titin isoform X54
SVGRATSTAELLVQGEEVVPAKKTKTIVSTSTAELLVTAETAPPNFSQRLQSTTARQGSQ
SVGRATSTAELLVQGEEVVPAKKTKTIVSTAQISKSRETRIEKKIEAHFDARSIATVEMV
IDGAAGQELPHKTPPRIPLKPKSRSPTPPSIAAKAQLARQQSPSPIRHSPSPVRHVRAPT

Мне нужно сопоставить для каждой строки моего первого файла идентификатор Uniref90_XXXXXX с идентификатором Uniref90_XXXXXX второго файла.Когда совпадение закончено, мне нужно вернуть последовательность (буквы ... TNGSGQATS .... = последовательности) к соответствующему идентификатору.

Например, в первом ряду 2 идентификатора Uniref90_XXXXXиз первого файла я хотел бы получить вывод, подобный следующему:

>UniRef90_A0A0K2VG56 - Cluster: titin isoform X29
MATQAPTFTQPLQSVVVLEGSTATFEAHISGFPVPEVSWFRDGQVISTSTLPGVQISFSD
GRAKLMIPAVTKANSGRYSLRATNGSGQATSTAELLVKAETAPPNFVQRLQSMTVRQGSQ
VRLQVRVTGIPTPVVKFYRDGAEIQSSLDFQISQEGELYSLLIVEAYPEDSGTYSVNATN
SVGRATSTAELLVQGEEVVPAKKTKTIVSTAQISKSRETRIEKKIEAHFDARSIATVEMV
IDGAAGQELPHKTPPRIPLKPKSRSPTPPSIAAKAQLARQQSPSPIRHSPSPVRHVRAPT   ##first ID of the first line
>UniRef90_A0A0P5UY87 - Cluster: titin isoform X4
VRLQVRVTGIPTPVVKFYRDGAEIQSSLDFQISQEGELYSLLIVEAYPEDSGTYSVNATN   
SVGRATSTAELLVQGEEVVPAKKTKTIVSTAQISKSRETRIEKKIEAHFDARSIATVEMV
GRAKLMIPAVAAGHSGRYTLQATNGSGQATSTAELLVTAETAPPNFSQRLQSTTARQGSQ   ##second ID of the first line

И мне нужно сделать это для каждой строки моего первого файла.

1 Ответ

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

Так что вам, похоже, нужно заказать Uniref90_XXXXXX s в соответствии с их порядком в первом файле.

Здесь UniRef_ids.txt - ваш первый файл, UniRef_data.txt - ваш второй файл, UniRef_data_ordered.txt - выходной файл.

Я заметил, что каждый Uniref90_XXXXXX, кажется, начинается с > и продолжается, охватывая переменное число строк, до следующего > или, я полагаю, до конца файла.

Я обработал только одно исключение: если Uniref90_XXXXXX появляется ваш первый файл, но не ваш второй. Он просто выводит предупреждение на вашу консоль (а не на ваш файл).

Если остальные файлы отформатированы по-другому, это может не сработать. Точно так же, если ваши файлы имеют размер в несколько гигабайт, мой подход может быть неуместным, поскольку я считываю в память все содержимое вашего второго файла.

# We first go through the second file, get all the Uniref90_XXXXXX IDs, and 
# put their sequences (including the Uniref90_XXXXXX header line) into a dict.
# A sequence can be accessed like so: uniref_dict["UniRef90_A0A0K2VG56"]
with open("UniRef_data.txt", "rt") as f:
    data = f.read()

uniref_dict = {}
for uniref in [f">{chunk.rstrip()}" for chunk in data.split(">")]:
    uniref_id = uniref[1:uniref.find(" ")]
    uniref_dict[uniref_id] = uniref

# Then we go through the first file, line by line, id by id, and write to 
# a new file the corresponding sequence (again, including the Uniref90_XXXXXX 
# header line, as per your output) and append the Uniref90_XXXXXX at the end.
with open("UniRef_ids.txt", "rt") as fin:
    with open("UniRef_data_ordered.txt", "wt") as fout:
        for line in fin:
            line = line.rstrip()
            uniref_ids = line.split(" ")
            for uniref_id in uniref_ids:
                try:
                    fout.write("{} ##{}\n".format(uniref_dict[uniref_id], uniref_id))
                except KeyError as e:
                    print(f"uniref_id '{uniref_id}' found in id file but not data file. Continuing...")

UniRef_data_ordered.txt:

>UniRef90_A0A0K2VG56 - Cluster: titin isoform X29
MATQAPTFTQPLQSVVVLEGSTATFEAHISGFPVPEVSWFRDGQVISTSTLPGVQISFSD
GRAKLMIPAVTKANSGRYSLRATNGSGQATSTAELLVKAETAPPNFVQRLQSMTVRQGSQ
VRLQVRVTGIPTPVVKFYRDGAEIQSSLDFQISQEGELYSLLIVEAYPEDSGTYSVNATN
SVGRATSTAELLVQGEEVVPAKKTKTIVSTAQISKSRETRIEKKIEAHFDARSIATVEMV
IDGAAGQELPHKTPPRIPLKPKSRSPTPPSIAAKAQLARQQSPSPIRHSPSPVRHVRAPT ##UniRef90_A0A0K2VG56
>UniRef90_A0A0P5UY87 - Cluster: titin isoform X4
VRLQVRVTGIPTPVVKFYRDGAEIQSSLDFQISQEGELYSLLIVEAYPEDSGTYSVNATN
SVGRATSTAELLVQGEEVVPAKKTKTIVSTAQISKSRETRIEKKIEAHFDARSIATVEMV
GRAKLMIPAVAAGHSGRYTLQATNGSGQATSTAELLVTAETAPPNFSQRLQSTTARQGSQ ##UniRef90_A0A0P5UY87
>UniRef90_A0A095VQ09 - Cluster: LOW QUALITY PROTEIN: titin
MTTKAPTFTQPLQSVVALEGSAATFEAHISGSPVPEVSWYRDGQVLSAATLPGVQISFSD
GRAKLMIPAVAAGHSGRYTLQATNGSGQATSTAELLVTAETAPPNFSQRLQSTTARQGSQ
VRLDVRVTGIPTPVVKFYRDRAEIQSSPDFQILQEGDLYSLIIAEAYPEDSGTYSVNATN ##UniRef90_A0A095VQ09
>UniRef90_A0A0C1UI80 - Cluster: LOW QUALITY PROTEIN: lafev
GRAKLMIPAVTKANSGRYSLRATNGSGQATSTAELLVKAETAPPNFVQRLQSMTVRQGSQ
VRLQVRVTGIPTPVVKFYRDGAEIQSSLDFQISQEGLARQQSPSPIRHSPSPVRHVRAPT ##UniRef90_A0A0C1UI80
>UniRef90_A0A1M4ZSK2  - Cluster: titin isoform X54
SVGRATSTAELLVQGEEVVPAKKTKTIVSTSTAELLVTAETAPPNFSQRLQSTTARQGSQ
SVGRATSTAELLVQGEEVVPAKKTKTIVSTAQISKSRETRIEKKIEAHFDARSIATVEMV
IDGAAGQELPHKTPPRIPLKPKSRSPTPPSIAAKAQLARQQSPSPIRHSPSPVRHVRAPT ##UniRef90_A0A1M4ZSK2


возможно ли создавать отдельные файлы для каждой итерации цикл? Я имею в виду, что для каждой строки первого файла я хотел бы создать файл с идентификатором и соответствующими последовательностями?

Да, это возможно. Нам просто нужно открыть выходной файл и написать код внутри цикла for, который проходит по строкам в первом файле, и дать каждому файлу уникальное имя.

# We first go through the second file, get all the Uniref90_XXXXXX IDs, and 
# put their sequences (including the Uniref90_XXXXXX header line) into a dict.
# A sequence can be accessed like so: uniref_dict["UniRef90_A0A0K2VG56"]
with open("UniRef_data.txt", "rt") as f:
    data = f.read()

uniref_dict = {}
for uniref in [f">{chunk.rstrip()}" for chunk in data.split(">")]:
    uniref_id = uniref[1:uniref.find(" ")]
    uniref_dict[uniref_id] = uniref

# Then we go through the first file, line by line, and write to a new  
# file the ids and their corresponding sequences (again, including the 
# Uniref90_XXXXXX header line, as per your output)
with open("UniRef_ids.txt", "rt") as fin:
    # Each iteration of this for loop is a new line of Uniref90_XXXXXX ids,
    # so we've moved the file writing code inside of this loop.
    # enumerate gives us a counter - i - that starts at 1, and increments by 1
    # after each iteration. We use this to give each file a unique name.
    for i, line in enumerate(fin, start=1):
        line = line.rstrip()
        uniref_ids = line.split(" ")
        with open(f"UniRef_data_by_id_row_{i:03}.txt", "wt") as fout:
            for uniref_id in uniref_ids:
                try:
                    fout.write(uniref_dict[uniref_id] + "\n")
                except KeyError as e:
                    print(f"uniref_id '{uniref_id}' found in id file but not data file. Continuing...")

Кстати, это код, который генерирует наши имена файлов:

f"UniRef_data_by_id_row_{i:03}.txt"

Префикс f сообщает Python, что это f-string. Он оценивает, что находится в {} s и возвращает строку. Перед : стоит значение , а после спецификаторы формата . В этом случае мои спецификаторы формата 0-pads i на ширину 3, давая мне имена файлов, такие как:

UniRef_data_by_id_row_001.txt
UniRef_data_by_id_row_999.txt

Таким образом, очень легко сортировать файлы в вашем файловом менеджере.

Вы можете называть файлы по-разному. Например, если вы не хотите подчеркивания и хотите дополнить число пробелами вместо 0:

f"UniRef Data Ordered by ID - Row {i: >4}.txt"
UniRef Data Ordered by ID - Row    1.txt
UniRef Data Ordered by ID - Row 9999.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...