Python 计算文件中某个三联体的数目(DNA密码子分析)

Python 计算文件中某个三联体的数目(DNA密码子分析),python,shell,bioinformatics,Python,Shell,Bioinformatics,这个问题实际上是针对DNA密码子分析的,简单地说,假设我有这样一个文件: atgaaaccaaag… 我想数一数这个文件中存在的“aaa”三元组的数量。重要的是,三联体从一开始就开始了(这意味着atg、aaa、cca、aag……),因此在本例中,结果应该是1而不是2‘aaa’。 是否有任何Python或Shellscript方法可以做到这一点?谢谢 文件中的首次读取 with open("some.txt") as f: file_data = f.read() 然后把它分成3块 co

这个问题实际上是针对DNA密码子分析的,简单地说,假设我有这样一个文件:
atgaaaccaaag…
我想数一数这个文件中存在的“aaa”三元组的数量。重要的是,三联体从一开始就开始了(这意味着atg、aaa、cca、aag……),因此在本例中,结果应该是1而不是2‘aaa’。
是否有任何Python或Shellscript方法可以做到这一点?谢谢

文件中的首次读取

with open("some.txt") as f:
    file_data = f.read()
然后把它分成3块

codons = [file_data[i:i+3] for i in range(0,len(file_data),3)]
然后数一数

print codons.count('aaa')
像这样

>>> my_codons = 'atgaaaccaaag'
>>> codons = [my_codons[i:i+3] for i in range(0,len(my_codons),3)]
>>> codons
['atg', 'aaa', 'cca', 'aag']
>>> codons.count('aaa')
1

显而易见的解决方案是将字符串拆分为3个字符的片段,然后计算“aaa”的出现次数:

如果字符串真的很长,那么这个解决方案将在创建子字符串列表时不必要地占用一些内存

s = 'atgaaaccaaag'
>>> sum(s[i : i + 3] == 'aaa' for i in xrange(0, len(s), 3))
1
>>> s = 'aaatttaaacaaagg'
>>> sum(s[i : i + 3] == 'aaa' for i in xrange(0, len(s), 3))
2

这将使用生成器表达式而不是创建临时列表,因此内存效率更高。它利用了
True==1
,即
True+True==2

您可以首先使用以下方法将字符串拆分为三元组:

def split_by_size(input, length):
    return [input[i:i+length] for i in range(0, len(input), length)]

tripleList = split_by_size(input, length)
然后检查“aaa”,并将其汇总:

print sum(filter(lambda x: x == "aaa", tripleList))

使用一个简单的shell,假设您的fasta只包含一个序列

grep -v ">"  < input.fa |
tr -d '\n' |
sed 's/\([ATGCatgcNn]\{3,3\}\)/\1#/g' |
tr "#" "\n" |
awk '(length($1)==3)' |
sort |
uniq -c
grep-v“>”
是否可以假设文件中没有错误,即每组三个字母始终表示一个有效的集合?我猜他得到的是FASTA文件。。。它们通常被认为是有效的…相关的/可能重复的也相关的:将此移动到注释。。。您会发现BioPython非常有用:
grep -v ">"  < input.fa |
tr -d '\n' |
sed 's/\([ATGCatgcNn]\{3,3\}\)/\1#/g' |
tr "#" "\n" |
awk '(length($1)==3)' |
sort |
uniq -c