2015-02-06 124 views
0

我有一个函数可以模拟某些东西并将结果数组写入文本文件。Python写入函数输出到文件

例如,

def SimulationFunction(args): 
    #some simulation which results simOUT 
    f = open('results.txt','w') 
    f.write(str(simOUT) + '\n') 
    f.close() 

我想运行变化的输入参数的函数,输出保存到同一RESULTS.TXT文件的新行。

例如,

for i in inputArgs: 
    SimulationFunction(i) 

然而,当我尝试运行此,生成的文本文件只 包含了最近模拟运行的结果。

我在这里错过了什么? 任何建议将不胜感激!

回答

2

你必须append到文件不是write到文件。
这里是修复:

f = open('results.txt','a') 

'w'意味着你正在写的文件(覆盖)
'a'意味着要附加到文件

如果您想了解更多关于不同模式打开文件,请访问: http://www.tutorialspoint.com/python/python_files_io.htm

+0

谢谢!!!!!!!!! – user32147 2015-02-06 05:30:35

4

您必须附加到该文件,而不是覆盖它。

根据Python袖珍参考(马克鲁兹O'rielly):

模式是可选的字符串,用于指定在其中文件被打开的模式。它默认为'r',这意味着可以在文本模式下阅读。其他常用值为'w'用于写入(如果文件已存在则截断该文件)和'a'用于附加。

下面是模式打开(): (根据Tutorials Point

r - 打开一个文件为只读。文件指针位于文件的开头。这是默认模式。

rb - 以二进制格式打开只读文件。文件指针位于文件的开头。这是默认模式。

r+ - 打开文件进行读写。文件指针将位于文件的开头。

rb+ - 以二进制格式打开文件以读写文件。文件指针将位于文件的开头。

w - 打开一个文件只写。如果文件存在,则覆盖该文件。如果文件不存在,则创建一个新文件进行写入。

wb - 打开一个只能以二进制格式写入的文件。如果文件存在,则覆盖该文件。如果文件不存在,则创建一个新文件进行写入。

w+ - 打开文件进行写入和读取。如果文件存在,则覆盖现有文件。如果该文件不存在,则创建一个用于读取和写入的新文件。

wb+ - 以二进制格式打开一个用于写入和读取的文件。如果文件存在,则覆盖现有文件。如果该文件不存在,则创建一个用于读取和写入的新文件。

a - 打开一个文件进行追加。如果文件存在,文件指针位于文件末尾。也就是说,该文件处于追加模式。如果文件不存在,它将创建一个新文件进行写入。

ab - 打开文件以二进制格式附加。如果文件存在,文件指针位于文件末尾。也就是说,该文件处于追加模式。如果文件不存在,它将创建一个新文件进行写入。

a+ - 为追加和读取打开文件。如果文件存在,文件指针位于文件末尾。该文件以附加模式打开。如果文件不存在,它会创建一个新的文件用于读写。

ab+ - 以二进制格式打开用于追加和读取的文件。如果文件存在,文件指针位于文件末尾。该文件以附加模式打开。如果文件不存在,它会创建一个新的文件用于读写。

此外,'w''a'将创建一个文件,如果它不存在,而'r'将抛出IOError类型的异常。

+0

您不应该复制和粘贴文档,而只需链接该网站。 – taesu 2015-02-06 00:47:54

+0

这是有争议的。我以前被拒绝投票,因为我可以分享这些信息。 – 2015-02-06 02:13:45

+0

@Charles谢谢! – user32147 2015-02-06 05:30:01

1

open()通话使用"a"(追加)模式等建议将解决您的眼前问题,但你不必担心如何清除出该文件每次运行或创建它,如果它不存在,等等。您可以使用"w"模式作为第一个功能,使用"a"作为后续模式,但这会引入必须以正确顺序调用它们的情况。当你需要它们的顺序不同时,可能会在六个月内再次咬你,并且必须追查为什么只有其中一些出现在文件中(因为具有“w”作为模式的那个现在在中间)。

更好的方法是打开文件功能,在把它作为一个参数(可能使用周围的功能with语句调用所以它就会自动关闭后)。这不仅避免了需要担心你的每一个功能模式,它避免了重复打开和关闭的文件,这是一个低效率的(虽然在现代系统中较小者):

def SimulationFunction1(args, outfile): 
    # some simulation, which results in simOUT 
    outfile.write(str(simOUT) + '\n') 

with open("my_output_file.txt", "w") as out: 
    SimulationFunction1(args, outfile=out) 
    SimulationFunction2(args, outfile=out) 
    SimulationFunction3(args, outfile=out) 

或者更好的,只是有功能结果,并具有来电处理它们写:

def SimulationFunction1(args): 
    # some simulation, which results in simOUT 
    return str(simOUT) 

with open("my_output_file.txt", "w") as out: 
    out.write(SimulationFunction1(args) + `\n`) 
    out.write(SimulationFunction2(args) + `\n`) 
    out.write(SimulationFunction3(args) + `\n`) 

后一种方法说明separation of concerns。你的代码的每个部分都应该关心做一件事:计算一个值,写入一个文件或者其他东西。在单个“块”代码(函数,类,等等)中执行多项操作会使得难以理解,维护和重用。

有一个地方,我可以有(事实上,可能应该有)在那里分开的担忧,并没有......你能看到它吗? :-)

+1

仅供参考,如果不存在,''a''将创建一个文件。 – 2015-02-06 02:55:48

+0

@ kindall谢谢!!!!!!! – user32147 2015-02-06 05:31:31

+0

@ kindall非常感谢您为我提前思考!如果我要将函数调用几千次,那么每次打开文件都会影响性能? – user32147 2015-02-06 05:56:35