在Python中在ASCII文件中查找/替换带注释的子串

3 投票
4 回答
591 浏览
提问于 2025-04-16 16:53

我在做一个生物信息学项目时遇到了一点编码问题。简单来说,我的任务是从一个数据库中提取特定的序列,并用这些信息来注释一个序列对齐文件。这个对齐文件是纯文本格式,所以注释不会太复杂,最多就是把提取出来的序列用星号替换掉。

我有一个脚本,它会扫描数据库文件,提取我需要的所有序列,并把它们写入一个输出文件。接下来,我需要做的是,给定一个查询,读取这些序列,并把它们与ASCII对齐文件中的对应子串进行匹配。最后,对于每一个出现的特定序列(在一大串字符中),我想把这个特定序列XXXXX替换成一串星号*

我使用的代码大致是这样的(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 个回答

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

你可能误解了 w+ 这个文件模式。用 w+ 模式打开文件会把文件里的内容全部清空,也就是删除里面的所有东西。具体可以查看这个链接:http://docs.python.org/library/functions.html#open。当你执行以下代码时,你的序列数据就会消失:

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

另外,replace 函数是用来处理从文件中读取的字符串的。你需要明确地把修改后的字符串写回文件。

最好的办法是使用一个第三个文件来保存你的结果。如果你真的想的话,完成后可以把结果文件覆盖原来的 align_file

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)

撰写回答