繁体   English   中英

Python 将 function output 写入文件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM