2012-06-12 166 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) –