我有一个模拟某事的函数,并将结果数组写入文本文件。
例如,
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)
但是,当我尝试运行它时,仅生成文本文件 包含上次模拟运行的结果。
我在这里缺少什么? 任何建议将不胜感激!
答案 0 :(得分:6)
您必须附加到该文件,而不是覆盖它。
根据 Python Pocket Reference (Mark Lutz,O' rielly):
模式是一个可选字符串,用于指定打开文件的模式。它默认为
'r'
,这意味着可以在文本模式下打开。其他常见值为'w'
用于写入(如果文件已存在则截断文件)和'a'
用于追加。
以下是open()的模式: (根据Tutorials Point)
r
- 打开文件以供阅读。文件指针位于文件的开头。这是默认模式。
rb
- 打开一个文件,仅以二进制格式读取。文件指针位于文件的开头。这是默认模式。
r+
- 打开文件进行读写。文件指针位于文件的开头。
rb+
- 以二进制格式打开读写文件。文件指针位于文件的开头。
w
- 打开文件仅供写入。如果文件存在,则覆盖文件。如果该文件不存在,则创建一个用于写入的新文件。
wb
- 打开一个只能以二进制格式写入的文件。如果文件存在,则覆盖文件。如果该文件不存在,则创建一个用于写入的新文件。
w+
- 打开文件进行书写和阅读。如果文件存在,则覆盖现有文件。如果该文件不存在,则创建一个用于读写的新文件。
wb+
- 以二进制格式打开文件进行写入和读取。如果文件存在,则覆盖现有文件。如果该文件不存在,则创建一个用于读写的新文件。
a
- 打开要追加的文件。如果文件存在,则文件指针位于文件的末尾。也就是说,文件处于追加模式。如果该文件不存在,则会创建一个用于写入的新文件。
ab
- 打开一个文件,以二进制格式附加。如果文件存在,则文件指针位于文件的末尾。也就是说,文件处于追加模式。如果该文件不存在,则会创建一个用于写入的新文件。
a+
- 打开文件以进行追加和阅读。如果文件存在,则文件指针位于文件的末尾。该文件以追加模式打开。如果该文件不存在,则会创建一个用于读写的新文件。
ab+
- 打开一个文件,用于以二进制格式追加和读取。如果文件存在,则文件指针位于文件的末尾。该文件以追加模式打开。如果该文件不存在,则会创建一个用于读写的新文件。
此外,'w'
和'a'
会创建一个不存在的文件,而'r'
会抛出IOError
类型的异常。
答案 1 :(得分:4)
在"a"
电话上使用open()
(附加)模式可以解决您当前的问题,但是您必须担心如何清除每次运行的文件,或者创建它如果它不存在,等等。您可以通过对第一个函数使用"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。代码的每个部分都应该关注做一件事:计算值,写入文件或其他任何东西。在单个“代码块”(函数,类,等等)中执行多项操作会使理解,维护和重用变得更加困难。
我可以拥有一个地方(事实上,可能应该有)在那里分开关注,但是没有......你能看到吗? : - )
答案 2 :(得分:2)
您必须append
提交 write
提交
这是修复:
f = open('results.txt','a')
'w'
表示您正在写入文件(覆盖)
'a'
表示您要附加到文件
如果您想了解有关不同打开文件模式的更多信息,请访问: http://www.tutorialspoint.com/python/python_files_io.htm