2016-02-24 11 views
2

我正在處理一個文本,其中有幾列和多行,如下所示:將特定位置的字符串替換爲文本,然後重寫所有文本

我想將索引[4]中的「A」替換爲「B」。

ATOM 1 N ARG A 88 63.055 9.295 9.736 1.00 25.54   N 
ATOM 2 CA ARG A 88 61.952 10.108 10.353 1.00 26.02   C 

和重寫我的文字:

ATOM 1 N ARG B 88 63.055 9.295 9.736 1.00 25.54   N 
ATOM 2 CA ARG B 88 61.952 10.108 10.353 1.00 26.02   C 

我使用這個劇本,但它改變了所有的 「A」 至 「B」。

file = open('1qib.pdb', 'r') 
file2 = open('new.pdb', 'w') 

for i, line in enumerate(file): 
    s = line.split()[4] 
    file2.write(line.replace(s, "B")) 

file.close() 
file2.close() 

回答

0

嘗試做這樣的:

file = open('1qib.pdb', 'r') 
file2 = open('new.pdb', 'w') 

for i, line in enumerate(file): 
    spl = line.split() #1 
    spl[4] = spl[4].replace("A", "B") #2 
    newline = " ".join(spl) #3 
    file2.write(newline) #4 

file.close() 
file2.close() 

步驟一步的解釋:

  1. 請注意,您在這裏執行的操作是將該行首先拆分爲字符串列表。

    spl = line.split() 
    
  2. 然後你只想要替換字符串新的項目列表的指數= 4。

    spl[4] = spl[4].replace("A", "B") 
    
  3. 最後你重新加入列表

    newline = " ".join(spl) 
    
  4. 你把它寫入文件再次

    file2.write(newline) 
    
+0

我如何申請格式之前波紋管構造新文本? 「%-6s%5d%4s%1s%3s%1s%4d%1s%8.3f%8.3f%8.3f%6.2f%6.2f%2s%2s」 – Berk

+0

format * below *? – Ian

+0

正如我試圖保持PDB文件的標準格式。 – Berk

1

line.replace(src, dst)的意思是 「把字符串linedst取代的src所有實例」。因此,即使您將src定義爲「line中的第五個詞」,替換操作將應用於整條線。

所以,不要做 - 取代像這樣只有該實例:

with open('1qib.pdb', 'r') as fin, open('new.pdb', 'w') as fout: 
    for line in fin: 
     items = line.split() 
     items[4] = "B" 
     fout.write(" ".join(items))