2016-06-30 51 views
-1

我想逐行讀取一個文件,並檢查每行是否我的字典允許一行字符串與另一個字符串在同一行中。我想出了這個代碼閱讀文件和檢查字典

dic={'ALA':['N','H','CA','HA','CB','HB1','HB2','HB3','C','O'], 
'GLY':['N','H','CA','HA2','HA3','C','O'], 
(...) 
} 

fin=open('file.pdb','r') 

for line in fin: 
    atom=line[12:16].strip() 
    resi=line[17:20].strip() 
    if atom not in dic[resi]: 
     print(line) 

但它給我:

Traceback (most recent call last): 
File "names.py", line 38, in <module> 
if atom not in dic[resi]: 
KeyError: '3.2' 

所以這是行不通的。奇怪地將dic [resi]替換爲dic ['ALA']之類的東西可以很好地工作。我在這裏做錯了什麼?

+2

給我們一個'file.pdb'的片段,甚至像2-3行就足夠了 –

+3

顯然,無論是在'line [17:20] .strip()'讀取的是3.2,這不是一個殘留。沒有看到文件的性質是不可能的。 –

+0

它只是告訴你在'dic'中沒有鍵名'3.2'的鍵。也許你的切片給wrogn結果 – linusg

回答

1

的問題是你得到的3.2的價值resi的線路之一,自3.2不是DIC一個有效的密鑰,你得到一個例外。

for line in fin: 
    atom=line[12:16].strip() 
    resi=line[17:20].strip() 
    if resi in dic and atom not in dic[resi]: 
     print(line) 

編輯:

for line in fin: 
    atom=line[12:16].strip() 
    resi=line[17:20].strip() 
    if resi in dic.keys() and atom not in dic[resi]: 
     print(line) 

使用n關鍵字第一種方法是知道在字典中鍵的存在的最好方法。它在O(1)中運行(使用散列),而第二種方法在獲取字典的鍵後進行線性搜索。

在這兩種方法中,由於使用短路,如果第一個條件失敗,第二個條件將永遠不會被評估。或者,您可以使用try..except塊來解救異常。

僅供參考,請參閱here

+0

令人驚歎!我不知道我的文件頭在開始時有一些不同的行。非常感謝=) – Julian

0

您在dic中沒有名爲'3.2'的鑰匙。我想你應該首先檢查關鍵名稱。

for line in fin: 
    atom=line[12:16].strip() 
    resi=line[17:20].strip() 
    result = dic.get(resi) 
    if result and (atom not in result): 
     print(line) 
0

當您使用dic [resi]時,它說Keyerror因爲'resi'不是dic中的一個鍵,但'ALA'是您詞典中的一個鍵。如果您嘗試打印(dic ['ALA']),它將在「ALA」鍵下打印所有內容。