Как читать файлы с разделителями в 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>B6TTCG$$$>C1TTTT>C2ATGC']
который совпадает с вводом
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')]