Поиск / замена подстрок аннотациями в файле ASCII в Python - PullRequest
3 голосов
/ 03 мая 2011

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

У меня есть скрипт, который сканирует файл базы данных, извлекает все нужные мне последовательности и записывает их в выходной файл. Что мне нужно, учитывая запрос, чтобы прочитать эти последовательности и сопоставить их с соответствующими им подстроками в файлах выравнивания ASCII. Наконец, для каждого вхождения последовательности мотивов (подстрока очень большой строки символов) я бы заменил последовательность мотивов XXXXXXX последовательностью звездочек *.

Код, который я использую, выглядит следующим образом (11SGLOBULIN - имя записи белка в базе данных):

motif_file = open('/users/myfolder/final motifs_11SGLOBULIN','r')
align_file = open('/Users/myfolder/alignmentfiles/11sglobulin.seqs', 'w+') 
finalmotifs = motif_file.readlines()
seqalign = align_file.readlines() 


for line in seqalign:
    if motif[i] in seqalign:  # I have stored all motifs in a list called "motif"
        replace(motif, '*****') 

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

Я подозреваю, что проблема может заключаться в том факте, что мой файл ASCII - это просто один очень длинный список аминокислот, и Python не может знать, как заменить конкретную подстроку, скрытую в очень длинной строке.

Ответы [ 4 ]

2 голосов
/ 03 мая 2011

Вы неправильно понимаете режим файла w+.Использование режима w+ с open обрезает файл (то есть удаляет все в нем), см. http://docs.python.org/library/functions.html#open. Ваши последующие данные исчезают, как только вы позвоните:

align_file = open('/Users/myfolder/alignmentfiles/11sglobulin.seqs', 'w+')

Также replace будет работать со строками, считанными из файла.Вам нужно явно выписать измененные строки обратно.

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

2 голосов
/ 03 мая 2011

Что-то вроде следующего должно помочь. Я сделал предположение о ваших входных данных, так как вы не публиковали образцы и что вы используете Python 2.7.

motifs = [ x.strip() for x in open('final motifs_11SGLOBULIN','r') ]
redact = '*****'

with open('11sglobulin.seqs','r') as data_in, open('11sglobulin.seqs.new','w') as data_out:
  for seq in data_in:
    for motif in motifs:
      while True:
        x = seq.find(motif)
        if x >= 0:
          seq = seq[:x] + redact + seq[x+len(motif):]
        else:
          break
  data_out.write(seq)
1 голос
/ 03 мая 2011

Вы могли бы немного упростить это, изменив внутренний цикл while с:

while True:
    x = seq.find(motif)
    if x >= 0:
      seq = seq[:x] + redact + seq[x+len(motif):]
    else:
      break

на:

if motif in seq:
  seq = seq.replace(motif, redact)
0 голосов
/ 07 мая 2011

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

align_file_rmode = open('/Users/spyros/folder1/python/printsmotifs/alignfiles/query, 'r') 
align_file_amode = open('/Users/spyros/folder1/python/printsmotifs/alignfiles/query, 'a+')

finalmotifs = motif_file.readlines()
seqalign = align_file_rmode.readlines() 

for line in seqalign: 
   for item in finalmotifs:
      item = item.strip().upper()
      if item in line:
         line = line.replace(item, '$' * len(item)) 
         align_file_amode.write(line) 

motif_file.close()
align_file_rmode.close()
align_file_amode.close()
...