[英]Python writing function output to a file
我有一个 function 模拟某些东西并将结果数组写入文本文件。
例如,
def SimulationFunction(args):
#some simulation which results simOUT
f = open('results.txt','w')
f.write(str(simOUT) + '\n')
f.close()
我想在不同的输入 arguments 上运行 function 并将输出保存到相同 results.txt 文件的新行中。
例如,
for i in inputArgs:
SimulationFunction(i)
但是,当我尝试运行它时,生成的文本文件仅包含上次模拟运行的结果。
我在这里想念什么? 任何建议将不胜感激!
您必须附加到文件,而不是覆盖它。
根据Python Pocket Reference (Mark Otz,O'rielly)的说法:
Mode是一个可选字符串,用于指定打开文件的模式。 默认为
'r'
,这意味着可以在文本模式下阅读。 其他通用值是用于写入的'w'
(如果文件已经存在,则将其截断)和用于附加的'a'
。
以下是open()的模式:( 根据Tutorials Point的介绍 )
r
打开一个文件以供只读。 文件指针位于文件的开头。 这是默认模式。
rb
打开一个文件,仅以二进制格式读取。 文件指针位于文件的开头。 这是默认模式。
r+
-打开一个文件以供读取和写入。 文件指针将位于文件的开头。
rb+
-打开文件以二进制格式读取和写入。 文件指针将位于文件的开头。
w
打开仅用于写入的文件。 如果文件存在,则覆盖该文件。 如果该文件不存在,请创建一个新文件进行写入。
wb
打开一个仅以二进制格式写入的文件。 如果文件存在,则覆盖该文件。 如果该文件不存在,请创建一个新文件进行写入。
w+
-打开文件进行读写。 如果文件存在,则覆盖现有文件。 如果该文件不存在,请创建一个新文件以进行读写。
wb+
-打开一个文件,以二进制格式进行读写。 如果文件存在,则覆盖现有文件。 如果该文件不存在,请创建一个新文件以进行读写。
a
-打开文件进行追加。 如果文件存在,则文件指针位于文件的末尾。 也就是说,文件处于附加模式。 如果该文件不存在,它将创建一个新文件进行写入。
ab
打开文件以二进制格式追加。 如果文件存在,则文件指针位于文件的末尾。 也就是说,文件处于附加模式。 如果该文件不存在,它将创建一个新文件进行写入。
a+
-打开文件以进行附加和读取。 如果文件存在,则文件指针位于文件的末尾。 该文件以追加模式打开。 如果该文件不存在,它将创建一个用于读取和写入的新文件。
ab+
-以二进制格式打开文件以进行附加和读取。 如果文件存在,则文件指针位于文件的末尾。 该文件以追加模式打开。 如果该文件不存在,它将创建一个用于读取和写入的新文件。
同样,如果'w'
和'a'
不存在,则会创建一个文件,而'r'
将抛出IOError
类型的异常。
像其他人建议的那样,在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`)
后一种方法说明了关注点分离 。 代码的每一部分都应该关注做一件事:计算值,写入文件等。 在单个“大块”代码(功能,类等)中执行多项操作将使其更难以理解,维护和重用。
我在那里有个地方(实际上, 应该有个地方)可以分开关注,但是没有……你看到了吗? :-)
您必须append
到文件而不是 write
文件。
解决方法是:
f = open('results.txt','a')
'w'
表示您正在写入文件(覆盖)
'a'
表示您要追加到文件
如果要了解有关打开文件的不同模式的更多信息,请访问: http : //www.tutorialspoint.com/python/python_files_io.htm
What I have found useful with my CSV files, that is, when I want to output a csv file directly from a function, I have done the following:
import pandas as pd #(allows me to use pd.to_csv)
#1. create a save path, location where I want to save my file
save_path = 'D:/results-output/fs.csv'
#2. create a small function that takes the csv data and path as arguments
def savefile(data_to_save, filepath):
return data_to_save.to_csv(filepath, index=False)
#3. call the function with the data and path arguments and the .csv file is outputted to the location in my save_path.
In this example, my data_to_save = patl
savefile(patl, save_path)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.