2012-06-12 250 views
1

我想知道如何將數組保存到文件。你已經幫了我很多,但我有比較幼稚的問題(我是新來的Python):如何將數組保存到文件

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

目前我有這樣的代碼,但它是從陣列中只保存最後一項沒有全部列於items_grep。如何解決這個問題?

items = [] 
with open("test.txt", mode="r") as itemfile: 
    for line in itemfile: 
     if line.startswith("@<TRIPOS>MOLECULE"): 
      items.append([]) 
      items[-1].append(line) 
     else: 
      items[-1].append(line)  
# 
# list to grep 
items_grep = open("list.txt", mode="r").readlines() 
# writing files 
for i in items: 
    if i[1] in items_grep: 
     open("grep.txt", mode="w").write("".join(i)) 

預先感謝您!

回答

1

您的文件只顯示最後一個值的原因是因爲每次使用w標誌打開文件時,它都會擦除現有文件。如果你打開一次,然後使用文件對象,你會沒事的,所以你會這樣做(注意,這不是一個非常乾淨/ pythonic的方式,只是清楚如何打開命令工作)

myfile = open("grep.txt", "w") 
for i in ... 
    if i[1] ...: 
     myfile.write(i + '\n') 

來處理這個簡單的方法是首先做一個列表理解,然後加入,例如:

newstr = '\n'.join([''.join(i) for i in items if i[1] in items_grep]) 

然後只寫整個字符串的文件一次。請注意,如果不在項目之間添加\n,則不會將每個項目放在一個新行中,而是會將所有項目都一個接一個添加到另一個空間中。

您還應該考慮使用with關鍵字來自動關閉文件。

with open("grep.txt","w") as f: 
    f.write(newstr) 
+0

非常感謝!問題在於**加入**,請您描述更多細節。爲什麼只有最後一個?更新了 –

+0

以添加問題的答案。你在for循環的每一次迭代中重新打開這個文件(所以它每次都會被擦除) –

+1

@JohnAmraph所以,''\ n'.join()'爲你解決了這個問題的原因是因爲它把你所有的文件寫入合併成一個聲明(所以它們都不會互相覆蓋:P) –