3

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

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

4 回答 4

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)
于 2011-05-03T14:16:08.257 回答
2

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

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

还将replace对从文件中读取的字符串进行操作。您需要将更改后的字符串显式写回。

您最好的选择是使用第三个文件来存储您的结果。如果您真的愿意,您可以在align_file完成后将生成的文件复制到原始文件上。

于 2011-05-03T14:49:49.263 回答
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)
于 2011-05-03T14:34:52.523 回答
0

谢谢大家,我非常感谢您的回复,对于回答的问题感到抱歉。所以基本上我应该做的是,正如许多人指出的那样,打开文件进行注释并将这些注释写入一个新文件。这段代码起到了作用:

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()
于 2011-05-07T15:48:30.590 回答