【问题标题】:How can I reverse compliment a multiple sequence fasta file with python?如何使用 python 反向补充多序列 fasta 文件?
【发布时间】:2014-03-03 22:22:22
【问题描述】:

我是 python 新手,我试图弄清楚如何读取具有多个序列的 fasta 文件,然后创建一个包含序列反向补充的新 fasta 文件。该文件将类似于:

>智人 ACGTCAGTACGTACGTCATGACGTACGTACTGACTGACTGACTGACGTACTGACTGACTGACGTACGTACGTACGTACGTACGTACTG

>犬狼疮 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()

这行得通,但我知道有更好的方法来迭代该末端部分。有更好的解决方案吗?

【问题讨论】:

  • 您是否尝试过任何导致问题的方法?如果是,请包括它。我觉得您可能跳过了asking a good question 的“搜索和研究”步骤。这个问题是非常开放的,将涉及许多不同类型的功能。例如,您必须阅读该文件。然后你将不得不以某种方式处理它的内容。以目前的形式,它可能过于宽泛而无法在主题上考虑。从问题的一个方面开始,例如读取文件,一旦解决了问题,就继续下一个。
  • 我真的只是想知道是否有更好的方法来遍历 else 语句
  • 我知道你真的不需要我的表扬,但这使它成为一个更好的问题。谢谢你的澄清!

标签: python while-loop fasta dna-sequence


【解决方案1】:

我知道您认为这是自己的练习,但如果您有兴趣使用现有设施,请查看Biopython 包。特别是如果您要进行更多的序列工作。

这将允许您实例化一个序列,例如seq = Seq('GATTACA')。然后,seq.reverse_complement() 会给你反向补码。

请注意,反向互补不仅仅是字符串反转,核苷酸碱基也需要替换为它们的互补字母。

【讨论】:

  • 我可以将 biopython 与导入的 fasta 文件一起使用吗?还是我必须使用 >seq = Seq('GATTACA') 之类的东西。
  • 您还可以使用SeqIO 类读取FASTA 文件。你应该看看手册:biopython.org/wiki/SeqIO.
  • +1 表示您的“不要重新发明轮子”政策。如果你问我,学习这一课是一个很好的编程练习。 ;)
【解决方案2】:

假设我没看错,下面的代码对你有用吗?您可以将所需的交换添加到字典中。

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

【讨论】:

    【解决方案3】:

    这是一个字符串反转的简单示例。

    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 中运行它,看看会发生什么。

    【讨论】:

      【解决方案4】:

      通常,要遍历文本文件中的行,您使用 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多