2016-10-08 12 views
0

У меня есть формат файла, который выглядит, как этотКак читать файлы с разделителями в 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) Тогда, я считаю набор, который имеет максимум length => здесь Set (2)

(3) Если длина Set i не равна Set (2), тогда я добавляю «Z» в конце Set i, так что длина Set i теперь равна на длину набора (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 
+0

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

+0

Нет, до сих пор я боюсь, что нет. Когда я печатаю «setdraft», он дает мне вывод ['> 1ATGC> 2TTTT> 3ATGC> $$$> B1ATCG> B2TT-G> 3TTCG> B4TT-G> B5TTCG> B6TTCG $$$> C1TTTT> C2ATGC'] == => который является таким же, как на входе Traceback (самый последний вызов последнего): Файл "C: /Users/ACER/Desktop/trial.py", строка 25, в maxsetlength = макс (LEN (seqlist)) TypeError: объект 'int' не итерируется – Biotechgeek

+0

Пожалуйста, отредактируйте ваш вопрос, чтобы добавить эту информацию. –

ответ

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')] 
+0

Должен ли я импортировать что-нибудь, чтобы использовать zip?Я получаю эту ошибку AttributeError: объект 'module' не имеет атрибута 'zip_longest' – Biotechgeek

+0

'import itertools as it' для' it.zip_longest' - 'zip' является стандартным встроенным и не требует импорта. – AChampion

+0

Мне просто нужно это разъяснить - я не понимаю, почему вы вставили (y [-4:]) как часть кода? И почему вы спрашиваете, интересуюсь ли я «именно последние 4 персонажа - это те, которые вы ищете»? Кроме того, я продолжаю работать в этом AttirbuteError, даже после использования itertools – Biotechgeek