我正在阅读一个FASTA文件,其格式如下:
>gi|31563518|ref|NP_852610.1| microtubule-associated proteins 1A/1B light chain 3A isoform b [Homo sapiens] MKMRFFSSPCGKAAVDPADRCKEVQQIRDQHPSKIPVIIERYKGEKQLPVLDKTKFLVPDHVNMSELVKIIRRRLQLNPTQAFFLLVNQHSMVSVSTPIADIYEQEKDEDGFLYMVYASQETFGF
我必须读取文件,然后计算JC距离(对于一对序列,JC距离是-3/4 * ln(1 - 4/3 * p),其中p是站点的比例两者之间有所不同)
我已经建立了它的骨架,但我不确定如何做其余的事情。在读取和计算JukesCantor距离之后,我必须将其写入新的输出文件,它应该在一个表格中 我能得到的任何帮助非常感谢!谢谢,python和fasta文件的新手
def readData():
filename = input("Enter the name of the FASTA file: ")
infile = open(filename, "r")
def CalculateJC(x,y):
if x == y:
return 0
else:
return 1 # temporary*
def calcDists(seqs):
output = []
for seq1 in seqs:
newrow = []
for seq2 in seqs:
dist = calculateJS(seq1,seq2)
newrow.append(dist)
output.append(newrow)
list(enumerate(seasons))
return output
def outputDists(distMat):
pass
def main():
seqs = readData()
distMat = calcDists(seqs)
outputDists(distMat)
if__name__ == "__main__":
main()
答案 0 :(得分:1)
你一次问的问题太多了!专注于一个。
阅读和编写FASTA文件的内容在BioPython中(正如评论中所述)。
我注意到你还没有计算你的JC距离,所以也许这就是你需要帮助的地方。 以下是我提出的建议:
import itertools, math
def computeJC(seq1, seq2):
equal = 0
for base1, base2 in itertools.izip(seq1, seq2):
equal += (base1 == base2)
p = equal / float(len(seq1))
return -3/4 * math.log(1 - 4/3 * p)
这里解释了itertools.izip技巧:How can I iterate through two lists in parallel 这段代码适用于任何类型的字符串,当seq1或seq2到达结尾时,外观将停止。
其他人可能会想出一个" Pythonic单线",但首先要尝试理解我的方法。它避免了代码感觉到的陷阱:嵌套循环,不必要的分支,运行时列表增长,意大利面条代码等等。请享用!