获取关键字错误。也许是一个白人

2024-10-03 02:34:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要帮助让这个程序获取一个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)

Tags: csvinfordiff序列genecodonatg
1条回答
网友
1楼 · 发布于 2024-10-03 02:34:42

您的代码中有许多基本的缺陷,但是(其中)有一行是:

codon_1=Gene_112[codon:codon+3]

如果在某个对象的末尾执行这样的切片操作,并且切片扩展到对象的可用索引之外,则不会引发错误,而是返回原始对象的截断子集。例如:

>>> test = 'ABCD'
>>> test[2:3]
'C'
>>> test[4:]
''

类似的情况也会发生在列表中,但是您会得到一个空列表,而不是''。注意,''是空字符串,而不是空格' ',它仍然是一个字符,只是碰巧是空的

您可以做一些有助于解决这些问题的常规改进:

  • 使用with open(...)来读取文件,而不是open(...)后跟close(...)
with open('somefile.txt') as f:
    # Do file stuff with f
  • 使用''.join(some_str_with_newlines.splitlines())从字符串中删除换行符,而不是str.replace。这样做会得到一个长字符串—如果您希望得到一个行列表,只需执行splitlines(),它将返回一个分隔行列表

  • 不要使用索引迭代列表-只需迭代列表(for thing in some_list:)。如果您想以均匀大小的块(比如像您在这里所做的3块)来迭代某些东西,我强烈建议您使用一些东西来为您做块处理,比如这个excellent answer(包含在下面)中的代码。这适用于任何可编辑的对象,包括字符串

def chunks(lst, n):
    """Yield successive n-sized chunks from lst."""
    for i in range(0, len(lst), n):
        yield lst[i:i + n]

另一个注释-此代码将给Gene_112Gene_113留下for循环的最终迭代的结果,或Gene_11Gene_22的最后一项

for i in range(len(Gene_11)):
    Gene_112=Gene_11[i]
    Gene_113=Gene_22[i]

可能是压痕错误

相关问题 更多 >