Используйте файл для поиска в другом файле и печати строк, соответствующих шаблону, для первого файла - PullRequest
0 голосов
/ 07 мая 2020

Python нуб здесь. Я ломал себе голову, пытаясь это сделать, пробовал несколько инструментов Unix и убежден, что python - это путь к go.

У меня есть два файла, File1 имеет заголовки и числа, подобные этому:

>id1
77
>id2
2
>id3
2
>id4
22
...

Обратите внимание, что идентификационный номер уникален, но присвоенный ему номер может повторяться. У меня есть несколько таких файлов с одинаковым количеством заголовков (~ 500).

File2 имеет все номера File1 и добавленную последовательность

1
ATCGTCATA
2
ATCGTCGTA
...
22
CCCGTCGTA
...
77
ATCGTCATA
...

Обратите внимание, что идентификатор последовательности уникален, как и все последовательности после него. У меня такое же количество файлов, что и у File1, но количество последовательностей в каждом File2 может варьироваться (~ 150).

Мой желаемый результат - File1 с последовательностью из File2, важно, чтобы File1 сохраняет исходный порядок.

>id1
ATCGTCATA
>id2
ATCGTCGTA
>id3
ATCGTCGTA
>id4
CCCGTCGTA

Мой подход состоит в том, чтобы извлекать числа из File1 и использовать их в качестве шаблона для сопоставления в File2. Сначала я пытаюсь заставить эту работу работать только с парой файлов. вот чего я добился:

#!/usr/bin/env python

import re

datafile = 'protein2683.fasta.txt.named'
schemaseqs = 'protein2683.fasta'

with open(datafile, 'r') as f:
    datafile_lines = set([line.strip() for line in f]) #maybe I could use regex to get only lines with number as pattern?
    print (datafile_lines)

outputlist = []

with open(schemaseqs, 'r') as f:
    for line in f:
        seqs = line.split(',')[0]
        if seqs[1:-1] in datafile_lines:
            outputlist.append(line)

    print (outputlist)

Это выводит смесь шаблонов из File1 и последовательностей из File2. Любая помощь приветствуется.

Ps: Я открыт для изменений в структуре файлов, я попытался заменить \ n в File2 на "," безрезультатно.

Ответы [ 2 ]

0 голосов
/ 07 мая 2020
import re

datafile = 'protein2683.fasta.txt.named'
schemaseqs = 'protein2683.fasta'
datafile_lines = []
d = {}
prev = None
with open(datafile, 'r') as f:
    i = 0
    for line in f:
        if i % 2 == 0:
            d[line.strip()]=0
            prev = line.strip()
        else:
            d[prev] = line.strip()
        i+=1

new_d = {}
with open(schemaseqs, 'r') as f:
    i=0
    prev = None
    for line in f:
        if i % 2 == 0:
            new_d[line.strip()]=0
            prev = line.strip()
        else:
            new_d[prev] = line.strip()
        i+=1

for key, value in d.items():
    if value in new_d:
        d[key] = new_d[value]

print(d)

with open(datafile,'w') as filee:
    for k,v in d.items():
        filee.writelines(k)
        filee.writelines('\n')
        filee.writelines(v)
        filee.writelines('\n')

было бы легко создать два словаря и затем сопоставить оба словарных значения.

0 голосов
/ 07 мая 2020

Поскольку файлы так аккуратно организованы, я бы не стал использовать набор для хранения строк. Наборы не определяют порядок, а порядок этих строк передает много информации. Я бы также не стал использовать Regex; это, вероятно, излишне для задачи синтаксического анализа отдельных строк, но недостаточно мощно, чтобы отслеживать, какой идентификатор соответствует каждой последовательности гена.

Вместо этого я бы прочитал файлы в обратном порядке. Сначала прочтите файл с последовательностями генов и создайте сопоставление идентификаторов с генами. Затем прочтите первый файл и замените каждый идентификатор соответствующим значением в этом отображении.

Если идентификаторы представляют собой непрерывную последовательность (1, 2, 3 ... n, n + 1), то список вероятно, самый простой способ их хранения. Если файл уже в порядке, вам даже не нужно обращать внимание на идентификационные номера; вы можете просто пропустить каждую вторую строку и добавить каждую последовательность гена в массив по порядку. Если они не непрерывны, вы можете использовать словарь с идентификаторами в качестве ключей. В этом примере я буду использовать словарный подход:

id_to_gene_map = {}

with open(file2, 'r') as id_to_gene_file:
    for line_number, line in enumerate(id_to_gene_file, start=1):
        if line_number % 2 == 1:  # Update ID on odd numbered lines, including line 1
            current_id = line
        else:
            id_to_gene_map[current_id] = line  # Map previous line's ID to this line's value

with open(file1, 'r') as input_file, open('output.txt', 'w') as output_file:
    for line in input_file:
        if not line.startswith(">"):  # Keep ">id1" lines unchanged
            line = id_to_gene_map[line]  # Otherwise, replace with the corresponding gene
        output_file.write(line)    

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

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