2

我是 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]

文件 1.close()

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

4

4 回答 4

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
于 2014-03-03T23:47:40.477 回答
1

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

这将允许您使用 eg 实例化一个序列seq = Seq('GATTACA')。然后,seq.reverse_complement()会给你逆补。

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

于 2014-03-03T22:52:41.167 回答
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
于 2014-03-03T23:19:10.767 回答
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 中运行它,看看会发生什么。

于 2014-03-03T22:38:22.020 回答