2016-01-29 158 views
0

計劃獲取只有一個結果,而不是多個結果

f=open('something.txt'.'r') 
lines=f.readlines() 
for read in range(0,len(lines)): 
    c=lines[read] 
    d=lines[read] 
    if c[0:4]=='ATOM': 
     AX1=float(c[32:38]) 
     AY1=float(c[40:46]) 
     AZ1=float(c[48:54]) 
     A1=c[77] 
    if d[0:6]=='HETATM': 
     HX1=float(d[32:38]) 
     HY1=float(d[40:46]) 
     HZ1=float(d[48:54]) 
     H1=d[77] 
    distance=math.sqrt((HX1-AX1)**2+(HY1-AY1)**2+(HZ1-AZ1)**2) 
    print 'Distance b/w ',A1,' and ',H1,'',distance 

文件會像:

ATOM  1 N ALA A 4  15.660 74.786 38.080 1.00 29.54   N 
ATOM  2 CA ALA A 4  15.546 74.666 39.526 1.00 27.64   C 
ATOM  3 C ALA A 4  16.833 74.137 40.145 1.00 25.88   C 
ATOM  4 O ALA A 4  17.852 73.890 39.500 1.00 24.05   O 
. 
. 
. 
ATOM 6048 OXT ALA A 780  21.816 67.407 16.290 1.00 13.41   O 

HETATM 6050 C1 GLC A2002  5.415 71.753 22.098 1.00 21.40   C 
HETATM 6051 C2 GLC A2002  3.948 71.252 22.308 1.00 21.24   C 
HETATM 6052 C3 GLC A2002  3.065 71.966 21.254 1.00 20.81   C 
HETATM 6053 C4 GLC A2002  3.266 73.512 21.425 1.00 20.10   C 
HETATM 6054 C5 GLC A2002  4.737 73.893 21.253 1.00 21.47   C 
HETATM 6055 C6 GLC A2002  4.967 75.396 21.466 1.00 22.53   C 
HETATM 6056 O1 GLC A2002  6.224 71.231 23.190 1.00 22.04   O 
HETATM 6057 O2 GLC A2002  3.902 69.831 22.018 1.00 21.46   O 
HETATM 6058 O3 GLC A2002  1.682 71.659 21.493 1.00 21.68   O 
HETATM 6059 O4 GLC A2002  2.509 74.212 20.404 1.00 17.87   O 
HETATM 6060 O5 GLC A2002  5.516 73.179 22.244 1.00 21.76   O 
HETATM 6061 O6 GLC A2002  6.361 75.746 21.230 1.00 24.18   O 

我要計算使用上述公式的值。它應該將ATOM-1與所有的HETATM和ATOM-2相比較,以便與所有的HETATM進行比較。

但我得到的結果只有最後一個原子,而HETATM

結果

Distance b/w O and C 17.9335824921 
Distance b/w O and C 19.2422912617 
Distance b/w O and C 19.925505715 
Distance b/w O and C 20.1926162247 
Distance b/w O and C 18.9312388924 
Distance b/w O and C 19.3521031932 
Distance b/w O and O 17.4740790888 
Distance b/w O and O 18.963047118 
Distance b/w O and O 21.2256606258 
Distance b/w O and O 20.8804518629 
Distance b/w O and O 18.2881409662 
Distance b/w O and O 18.2427943583 
+0

這纔是真正的代碼? 'open('something.txt'。'r')'無效。 –

+0

你經歷所有的原子一行行你打任何HETATM之前,所以你開始HETATM之前的最後一個ATOM的數據被保存,和你比較的是ATOM所有HETATM。 – Ryan

回答

2

的問題是與此塊在這裏:

lines=f.readlines() 
for read in range(0,len(lines)): 
    c=lines[read] 
    d=lines[read] 

你只有一次循環,和分配cd在一個時間在同一行。

相反,你要循環一次c,並一次d。更Python的方式做,這是直接在lines循環,而不是range(0, len(lines))

lines=f.readlines() 
for c in lines: 
    for d in lines: 
     # the rest of your code 

此外,由Ryan指出的那樣,你是不是有A1H1做任何事情時,有不匹配,所以你可能在不經意間從以前的循環比較的舊數據。一定要在失敗ifelse語句跳過的情況下,或許還有一個continue

if c[0:4]=='ATOM': 
    AX1=float(c[32:38]) 
    AY1=float(c[40:46]) 
    AZ1=float(c[48:54]) 
    A1=c[77] 
else: 
    continue 
+0

謝謝@mhlester :)它的工作。 –

+0

'進口水珠 進口數學 F =開放( 'data.txt中', 'R') Q = f.readlines() 對於i在範圍(0,LEN(Q)): \t B = Q [ I] \t一個= b.rstrip() \t一個= a.lower() \t鏈= A [4] \t F =開放('/家庭/ IITM/Bond_Distance/{}。txt'.format(一個[0:4]), 'R') \t線= f.readlines() \t對C中的行: \t \t如果c [21] == {}格式([4]):'當我嘗試這樣得到這樣的錯誤,幫助我 '文件 「bond_length.py」,第13行,在 如果c [21] == {}格式([4]): IndexError:字符串索引超出range'的 –