2012-05-31 43 views
1

您好,我需要您的幫助解決以下問題。 我解析,看起來像這樣從python數組獲取文件名

@<TRIPOS>MOLECULE 
NAME123 
line3 
line4 
line5 
line6 
@<TRIPOS>MOLECULE 
NAME434543 
line3 
line4 
line5 
@<TRIPOS>MOLECULE 
NAME343566 
line3 
line4 

我currenly有這樣的代碼一個好的工作文件...

mols = [] 
with open("test2.mol2", mode="r") as molfile: 
    for line in molfile: 
     if line.startswith("@<TRIPOS>MOLECULE"): 
      mols.append(line) 
     else: 
      mols[-1] += line 
# 
for i in range(len(mols)): 
    out_filename = "file%d.mol2" % i 
    with open(out_filename, mode="w") as out_file: out_file.write(mols[i]); 

但whem我試圖把文件保存名稱根據第二數組的字段,@MOLECULE(NAME ....)之後的代碼,它不起作用。請幫我修復代碼。謝謝!

for i in mols: 
    out_filename = str(i.split()[1]) + ".mol2" % i 
    with open(out_filename, mode="w") as out_file: out_file.write(mols[i]); 

的錯誤是

Traceback (most recent call last): 
    File "<stdin>", line 2, in <module> 
TypeError: not all arguments converted during string formatting 

回答

1

我建議使用更結構化的列表:

for line in molfile: 
    if line.startswith("@"): 
     mols.append([]) 
     mols[-1].append(line) # Keep first line 
    else: 
     mols[-1].append(line) 

則:

for i in mols: 
    out_filename = i[0].strip() + ".mol2" 
    with open(out_filename, mode="w") as out_file: 
     out_file.write(''.join(i)); 
+0

但是這隻輸出第一個數組,而不輸出其他數組。 –

+0

而且我還需要@ MOLECULE作爲每個文件的第一行。 –

+0

這應該做到這一點。 – jpaugh

1

代碼包括".mol2" % i看起來它應該是字符串插值,但沒有提供佔位符進行插值。假設你知道如何使用%符號進行字符串插值,也許你的意思是類似".mol%s" % i

+0

沒有,我是新來的蟒蛇。每個文件應以.mol2結尾 –

+0

使用'+'代替'%'。 – jpaugh

0

當您在Python中使用後跟變量名稱的「%」時,它將在您的字符串中查找字符串格式序列並嘗試對其進行格式化。在你的第二個代碼片段中,Python沒有在你的字符串中找到格式說明符。