如何用python反转补充多序列fasta文件?

时间:2014-03-03 22:22:22

标签: python while-loop fasta dna-sequence

我是python的新手,我正在试图弄清楚如何读取包含多个序列的fasta文件,然后创建一个包含序列反向补充的新fasta文件。该文件看起来像:

> homo_sapiens ACGTCAGTACGTACGTCATGACGTACGTACTGACTGACTGACTGACGTACTGACTGACTGACGTACGTACGTACGTACGTACGTACTG

> Canis_lupus CAGTCATGCATGCATGCAGTCATGACGTCAGTCAGTACTGCATGCATGCATGCATGCATGACTGCAGTACTGACGTACTGACGTCATGCATGCAGTCATG

> Pan_troglodytus CATGCATACTGCATGCATGCATCATGCATGCATGCATGCATGCATGCATCATGACTGCAGTCATGCAGTCAGTCATGCATGCATCAT

我正在尝试学习如何使用for和while循环,所以如果解决方案可以包含其中一个,那么它将是首选。

到目前为止,我设法以非常不雅的方式做到如下:

  

file1 = open('/ path / to / file','r')

for line in file1:
   if line[0] == '>':
      print line.strip() #to capture the title line
   else:
      import re
      seq = line.strip()
      line = re.sub(r'T', r'P', seq)
      seq = line
      line = re.sub(r'A',r'T', seq)
      seq = line
      line = re.sub(r'G', r'R', seq)
      seq = line
      line = re.sub(r'C', r'G', seq)
      seq = line
      line = re.sub(r'P', r'A', seq)
      seq = line
      line = re.sub(r'R', r'C', seq)
      print line[::-1]
     

file1.close()

这有效,但我知道有更好的方法来遍历这个结尾部分。有更好的解决方案吗?

4 个答案:

答案 0 :(得分:1)

我知道您认为这是一个练习,但如果您对使用现有设施感兴趣,请查看Biopython包。特别是如果你要做更多的顺序工作。

这将允许您使用例如实例化序列seq = Seq('GATTACA')。然后,seq.reverse_complement()将为您提供反向补充。

请注意,反向补体不仅仅是字符串反转,核苷酸碱基也需要用其互补字母替换。

答案 1 :(得分:1)

假设我找到了你,下面的代码会为你工作吗?您只需将所需的交换添加到字典中即可。

d = {'A':'T','C':'G','T':'A','G':'C'}

with open("seqs.fasta", 'r') as in_file:
    for line in in_file:
        if line != '\n': # skip empty lines
            line = line.strip() # Remove new line character (I'm working on windows)
            if line.startswith('>'):
                head = line
            else:
                print head
                print ''.join(d[nuc] for nuc in line[::-1])

输出:

>homo_sapiens
CAGTACGTACGTACGTACGTACGTACGTCAGTCAGTCAGTACGTCAGTCAGTCAGTCAGTACGTACGTCATGACGTACGT
ACTGACGT
>Canis_lupus
CATGACTGCATGCATGACGTCAGTACGTCAGTACTGCAGTCATGCATGCATGCATGCATGCAGTACTGACTGACGTCATG
ACTGCATGCATGCATGACTG
>Pan_troglodytus
ATGATGCATGCATGACTGACTGCATGACTGCAGTCATGATGCATGCATGCATGCATGCATGCATGATGCATGCATGCAGT
ATGCATG

答案 2 :(得分:0)

以下是字符串反转的简单示例。

Python代码

string = raw_input("Enter a string:")
reverse_string = ""

print "our string is %s" % string
print "our range will be %s\n" % range(0,len(string))

for num in range(0,len(string)):

    offset = len(string) - 1
    reverse_string += string[offset - num]

    print "the num is currently: %d" % num
    print "the offset is currently: %d" % offset
    print "the index is currently: %d" % int(offset - num)
    print "the new string is currently: %s" % reverse_string
    print "-------------------------------"

    offset =- 1

print "\nOur reverse string is: %s" % reverse_string

添加了打印命令,以显示脚本中发生的情况。

在python中运行它,看看会发生什么。

答案 3 :(得分:0)

通常,要迭代文本文件中的行,您使用for循环,因为“open”返回一个可迭代的文件对象

>>> f = open('workfile', 'w')
>>> print f
<open file 'workfile', mode 'w' at 80a0960>

有关此here

的更多信息

您还可以使用上下文管理器“with”打开文件。这个关键语句会为你关闭文件对象,所以你永远不会忘记它。

我决定不包含“for line in f:”语句,因为你必须阅读几行来处理一个序列(标题,序列和空白行)。如果你尝试使用带有“readline()”的for循环,你最终会得到一个ValueError(试试:)

所以我会使用string.translate。此脚本打开一个名为“test”的文件,其中包含您的示例:

import string

if __name__ == "__main__":

    file_name = "test"
    translator = string.maketrans("TAGCPR", "PTRGAC")
    with open(file_name, "r") as f:
        while True:
            title = f.readline().strip()
            if not title:  # end of file
                break
            rev_seq = f.readline().strip().translate(translator)[::-1]
            f.readline()  # blank line
            print(title)
            print(rev_seq)

输出(以你的例子为准):

>homo_sapiens
RPGTPRGTPRGTPRGTPRGTPRGTPRGTRPGTRPGTRPGTPRGTRPGTRPGTRPGTRPGTPRGTPRGTRPTGPRGTPRGTPRTGPRGT
>Canis_lupus
RPTGPRTGRPTGRPTGPRGTRPGTPRGTRPGTPRTGRPGTRPTGRPTGRPTGRPTGRPTGRPGTPRTGPRTGPRGTRPTGPRTGRPTGRPTGRPTGPRTG
>Pan_troglodytus
PTGPTGRPTGRPTGPRTGPRTGRPTGPRTGRPGTRPTGPTGRPTGRPTGRPTGRPTGRPTGRPTGPTGRPTGRPTGRPGTPTGRPTG