在Python中在ASCII文件中查找/替换带注释的子串
我在做一个生物信息学项目时遇到了一点编码问题。简单来说,我的任务是从一个数据库中提取特定的序列,并用这些信息来注释一个序列对齐文件。这个对齐文件是纯文本格式,所以注释不会太复杂,最多就是把提取出来的序列用星号替换掉。
我有一个脚本,它会扫描数据库文件,提取我需要的所有序列,并把它们写入一个输出文件。接下来,我需要做的是,给定一个查询,读取这些序列,并把它们与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 个回答
你可以通过把最里面的那个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)
你可能误解了 w+
这个文件模式。用 w+
模式打开文件会把文件里的内容全部清空,也就是删除里面的所有东西。具体可以查看这个链接:http://docs.python.org/library/functions.html#open。当你执行以下代码时,你的序列数据就会消失:
align_file = open('/Users/myfolder/alignmentfiles/11sglobulin.seqs', 'w+')
另外,replace
函数是用来处理从文件中读取的字符串的。你需要明确地把修改后的字符串写回文件。
最好的办法是使用一个第三个文件来保存你的结果。如果你真的想的话,完成后可以把结果文件覆盖原来的 align_file
。
下面的代码应该可以解决你的问题。我根据你没有提供样本数据的情况,假设了一些关于你输入数据的内容,并且你是在使用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)