在Python中使用ASCII文件中的注释查找/替换子字符串

时间:2011-05-03 13:14:58

标签: python text-processing bioinformatics biopython

在我正在研究的生物信息学项目中,我遇到了一些编码问题。基本上,我的任务是从数据库中提取基序序列并使用该信息来注释序列比对文件。对齐文件是纯文本,因此注释不会是任何复杂的,最好只是用对齐文件本身中的星号替换提取的序列。

我有一个脚本扫描数据库文件,提取我需要的所有序列,并将它们写入输出文件。鉴于查询,我需要读取这些序列并将它们与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 个答案:

答案 0 :(得分:2)

以下内容应该可以解决问题。我已经对您的输入数据做了假设,因为您没有发布样本并且您正在运行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 :(得分:2)

您误解了w+文件模式。使用w+模式open将截断文件(即删除其中的所有内容),请参阅:http://docs.python.org/library/functions.html#open。 调用后,您的seq数据就会消失:

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

同样replace将对从文件读取的字符串进行操作。您需要明确地将更改后的字符串写出来。

最好的办法是使用第三个文件存储结果。如果您真的想要,可以在完成后将结果文件复制到原始align_file上。

答案 2 :(得分:1)

您可以通过更改最里面的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)

答案 3 :(得分:0)

谢谢大家,我非常感谢你的回复,对于dealy的回答感到抱歉。因此,基本上我应该做的就是打开文件来注释并将这些注释写入新文件。这段代码完成了这个伎俩:

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()