Как читать файлы с разделителями в Python и добавлять символы в конце?

У меня есть формат файла, который выглядит так

 >1ATGC>2TTTT>3ATGC>$$$>B1ATCG>B2TT-G>3TTCG>B4TT-G>B5TTCG>B6TTCG$$$>C1TTTT>C2ATGC

Примечание: "$$$" разделяет файл так, что все, что до $$$ установлено в 1, а после $$$ - в 2 и после следующего $$$ Set3 и т. Д.

Я должен сделать следующее:

а. Объединить последовательности после ">". Итак, я должен присоединиться к "ATGC", "TTTT", "ATGC" и сохранить в (1), и мне нужно объединить "ATCG", "TT-G", "TTCG", "TT-G", "TTCG", "TTCG" и сохранить как (2)... объединить снова и сохранить в (3)

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

("ATGCTTTTATGC","ATCGTT-GTTCGTT-GTTCGTTCG","TTTTATGC")

(2) Затем я нахожу набор, который имеет максимальную длину => здесь Set (2)

(3) Если длина Set i не равна Set (2), то я добавляю "Z" в конец Set i, так что длина Set i теперь равна длине Set (2)

(4) Я заменяю все "-" на "Z"

Вывод должен выглядеть так:

 ("ATGCTTTTATGCZZZZZZZZZZZZ",
 "ATCGTTZGTTCGTTZGTTCGTTCG",
 "TTTTATGCZZZZZZZZZZZZZZZZ")

Вот код, который я попытался:

in_file = open('c:/test.txt','r')
org = []
seqlist = []
seqstring = ""

for line in in_file:
    if line.startswith("$$$"):
         if seqstring!= "":
            seqlist.append(seqstring)
            seqstring = ""
         org.append(line.rstrip("\n"))
    elif line.startswith(">"):
        seqstring += line.rstrip("\n")
seqlist.append(seqstring)

setdraft = seqlist
maxsetlength = max(len(seqlist))

setdraft2 =[]  

for i in setdraft:
     if len(i) != maxsetlength:
         setdraft2 = i.append("Z")

setfinal =[]

for j in setdraft2:
     if j in setdraft2 =="-":
         setfinal = j.insert ("Z")

Вышеприведенный скрипт не работает. Это дает мне несколько ошибок. Например. Когда я печатаю setdraft это дает мне вывод

['>1ATGC>2TTTT>3ATGC>$$$>B1ATCG>B2TT-G>3TTCG>B4TT-G>B5TTCG>B‌​6TTCG$$$>C1TTTT>C2AT‌​GC']

который совпадает с вводом

Traceback (most recent call last):
  File "C:/Users/ACER/Desktop/trial.py", line 25, in <module>
    maxsetlength = max(len(seqlist))
TypeError: 'int' object is not iterable

1 ответ

Решение

Неясно, насколько хрупок ваш набор данных, но если он следует описанному выше шаблону (а именно последние 4 символа - те, которые вы ищете), то вы можете использовать пару split()с и itertools.zip_longest а также zip вернуться, чтобы добавить Z

>>> import itertools as it
>>> import string
>>> def digit_index(s):
...     for i, c in enumerate(s):
...         if c in string.digits:
...             return i
...     return 0
...
>>> s = '>1ATGC>2TTTT>3ATGC>$$$>B1ATCG>B2TT-G>3TTCG>B4TT-G>B5TTCG>B6TTCG$$$>C1TTTT>C2ATGC'
>>> parsed = [''.join(y[digit_index(y)+1:].replace('-', 'Z') for y in x.split('>')) for x in s.split('$$$')]
>>> parsed
['ATGCTTTTATGC', 'ATCGTTZGTTCGTTZGTTCGTTCG', 'TTTTATGC']
>>> [''.join(x) for x in zip(*it.zip_longest(*parsed, fillvalue='Z'))]
['ATGCTTTTATGCZZZZZZZZZZZZ',
 'ATCGTTZGTTCGTTZGTTCGTTCG',
 'TTTTATGCZZZZZZZZZZZZZZZZ']

Если вы не возражаете против этого, как список, то вы можете избежать join()вернем его обратно в строку:

>>> list(zip(*it.zip_longest(*parsed, fillvalue='Z')))
[('A', 'T', 'G', 'C', 'T', 'T', 'T', 'T', 'A', 'T', 'G', 'C', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z'), 
 ('A', 'T', 'C', 'G', 'T', 'T', 'Z', 'G', 'T', 'T', 'C', 'G', 'T', 'T', 'Z', 'G', 'T', 'T', 'C', 'G', 'T', 'T', 'C', 'G'),
 ('T', 'T', 'T', 'T', 'A', 'T', 'G', 'C', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z')]
Другие вопросы по тегам