我是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()
这有效,但我知道有更好的方法来遍历这个结尾部分。有更好的解决方案吗?
答案 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)
以下是字符串反转的简单示例。
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