我需要帮助让这个程序获取一个DNA序列并将其分解为3个序列(ATGCGTGGC=>;ATG,CGT,CCG)来创建密码子。然后它会把密码子和我代码中的“基因密码”字典进行比较。它似乎工作得很好,直到它到达最后一行的末尾,在那里会弹出这个关键字错误:
Traceback (most recent call last):
File "main.py", line 101, in <module>
Amino_A=genecode[codon_1]
KeyError: ''
我想知道我做错了什么?我使用行解释来删除新行('\n')并用空格('')替换它们,但是当它到达文件的末尾时,我猜它会在那里留下一个(''),并且会弹出上面的错误。我该怎么办?谢谢你的帮助
genecode = {
'ATA':'I', 'ATC':'I', 'ATT':'I', 'ATG':'M',
'ACA':'T', 'ACC':'T', 'ACG':'T', 'ACT':'T',
'AAC':'N', 'AAT':'N', 'AAA':'K', 'AAG':'K',
'AGC':'S', 'AGT':'S', 'AGA':'R', 'AGG':'R',
'CTA':'L', 'CTC':'L', 'CTG':'L', 'CTT':'L',
'CCA':'P', 'CCC':'P', 'CCG':'P', 'CCT':'P',
'CAC':'H', 'CAT':'H', 'CAA':'Q', 'CAG':'Q',
'CGA':'R', 'CGC':'R', 'CGG':'R', 'CGT':'R',
'GTA':'V', 'GTC':'V', 'GTG':'V', 'GTT':'V',
'GCA':'A', 'GCC':'A', 'GCG':'A', 'GCT':'A',
'GAC':'D', 'GAT':'D', 'GAA':'E', 'GAG':'Glu',
'GGA':'G', 'GGC':'G', 'GGG':'G', 'GGT':'G',
'TCA':'S', 'TCC':'S', 'TCG':'S', 'TCT':'S',
'TTC':'F', 'TTT':'F', 'TTA':'L', 'TTG':'L',
'TAC':'Y', 'TAT':'Y', 'TAA':'_', 'TAG':'_',
'TGC':'C', 'TGT':'C', 'TGA':'_', 'TGG':'W'}
Gene1=open("HBB Norm.csv", "r")
Gene2=open("HBB Pos (Sickle Cell).csv", "r")
##HBB Norm and HBB Pos (Sickle Cell) are just the names of the csv files I want to import data from
Gene_1=Gene1.read()
Gene_11=[Gene_1.replace('\n','') for gene_1 in Gene_1]
Gene1.close()
Gene_2=Gene2.read()
Gene_22=[Gene_2.replace('\n','') for gene_2 in Gene_2]
Gene2.close()
AA_diff=[]
for i in range(len(Gene_11)):
Gene_112=Gene_11[i]
Gene_113=Gene_22[i]
for codon in range(0,len(Gene_11),3):
codon_1=Gene_112[codon:codon+3]
Amino_A=genecode[codon_1]
codon_2=Gene_113[codon:codon+3]
Amino_B=genecode[codon_2]
if Amino_A!=Amino_B: #Trying get a dash line btwn diff Amino Acids
AA_diff.append(Amino_B)
print(Amino_A,'-',Amino_B)
您的代码中有许多基本的缺陷,但是(其中)有一行是:
如果在某个对象的末尾执行这样的切片操作,并且切片扩展到对象的可用索引之外,则不会引发错误,而是返回原始对象的截断子集。例如:
类似的情况也会发生在列表中,但是您会得到一个空列表,而不是
''
。注意,''
是空字符串,而不是空格' '
,它仍然是一个字符,只是碰巧是空的您可以做一些有助于解决这些问题的常规改进:
with open(...)
来读取文件,而不是open(...)
后跟close(...)
使用
''.join(some_str_with_newlines.splitlines())
从字符串中删除换行符,而不是str.replace
。这样做会得到一个长字符串—如果您希望得到一个行列表,只需执行splitlines()
,它将返回一个分隔行列表不要使用索引迭代列表-只需迭代列表(
for thing in some_list:
)。如果您想以均匀大小的块(比如像您在这里所做的3块)来迭代某些东西,我强烈建议您使用一些东西来为您做块处理,比如这个excellent answer(包含在下面)中的代码。这适用于任何可编辑的对象,包括字符串另一个注释-此代码将给
Gene_112
和Gene_113
留下for循环的最终迭代的结果,或Gene_11
和Gene_22
的最后一项可能是压痕错误
相关问题 更多 >
编程相关推荐