有没有一种有效的方法从输入文件向函数传递参数?

2024-09-28 20:46:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用参数扫描测试不同的变量如何影响模型。我试图从一个文本文件中读入参数,并将它们传递给一个函数,在该函数中计算模型并返回答案并输出。你知道吗

例如,如果我有一个输入文件,第一行是参数名,后续行是我要计算的参数组合:

input.txt 
param1, param2, param3, ..., paramm
0,0,1
0,0,2
0,1,1
0,1,2
0,2,1
0,2,2
1,0,1
1,0,2
1,1,1
1,1,2
1,2,1
1,2,2

我有一个计算模型的函数。为了简单起见,我会说模型是我所有参数的总和:

def model(param1,param2,param3...,paramm):
    param1=0
    param2=0
    param3=0
    param4=0
    param5=0
    .
    .
    .
    paramn=0

    answer=parma1+param2+param3+param4+param5

    return answer

其中设置参数=0是一种初始化它们的方法(我现在知道它不适用于param1、param2或param3,因为它会覆盖写入它们的内容)。我包括param4和param5以表示可能存在其他参数,我不改变这些参数,而是采用一些默认值。你知道吗

如何读入文件并运行所有参数组合?我应该创建一个名为params的元组,并在每次读取文件后调整值,还是有更好的方法?你知道吗


编辑1:

我编辑了这个问题,添加了文本文件和常量中已知的更多参数。我最好创建一个parameter对象,并为每个传递给函数的过程编辑对象的值。你知道吗

请注意,虽然本例中的函数是一个和,但在实际程序中要复杂得多,很可能只使用参数的一个子集调用其他函数。例如

def model1(param1):
    a=1
    b=2
    c=3

    return a*param1**2+b*param1+c 

def model(param1,param2,param3...,paramm):
    param1=0
    param2=0
    param3=0
    param4=0
    param5=0
    .
    .
    .
    paramn=0

    answer=model1(param1)+param2+param3+param4+param5

Tags: 文件函数answer模型编辑参数modeldef
2条回答

使用with open并使model更容易解决问题,请使用以下完整代码:

def model(param1,param2,param3):
    return param1 + param2 + param3
with open('input.txt','r') as f:
    next(f)
    for i in f:
        print(model(*i.split(',')))

有几种方法可以做到这一点。如果文件中的第一行不存在,那么您可以将该文件视为.csv文件(“param1,param2,param3”的顶行是标题,随后的行是这三列的逗号分隔值)。Python已经有了现成的模块,可以在CSV文件中读写数据。你可以看看here。你知道吗

不过,在您的特定情况下,您的文件以一行数据开始,第二行上紧跟着CSV头,然后第三行以及以后的行有CSV dat。如果您最终尝试读取每行数字数据并将其传递给函数,则可以执行以下操作:

def find_sum(values):
    return sum(values)

with open(r"C:\tmp\myfile.txt", 'r') as f:
    data = f.readlines()

dataname = data[0].strip()            # The first row of the file
row_names = data[1].strip().split(',')  # The second row of the file

for line in data[2:]:
    values = [ float(i) for i in line.strip().split(',') ]
    print "My function on", values, "returns", find_sum(values)

打印出来:

My function on [0.0, 0.0, 1.0] returns 1.0
My function on [0.0, 0.0, 2.0] returns 2.0
My function on [0.0, 1.0, 1.0] returns 2.0
My function on [0.0, 1.0, 2.0] returns 3.0
My function on [0.0, 2.0, 1.0] returns 3.0
My function on [0.0, 2.0, 2.0] returns 4.0
My function on [1.0, 0.0, 1.0] returns 2.0
My function on [1.0, 0.0, 2.0] returns 3.0
My function on [1.0, 1.0, 1.0] returns 3.0
My function on [1.0, 1.0, 2.0] returns 4.0
My function on [1.0, 2.0, 1.0] returns 4.0
My function on [1.0, 2.0, 2.0] returns 5.0

仔细看一下命令[ float(i) for i in line.strip().split(',') ],它的作用是从文件中取出一行数字,使用.strip()切掉末尾的换行符,拆分逗号上的内容,并将内容从字符串转换为浮点数。你可以用整数代替浮点数,但我不知道你的真实数据是否包含非数值。如果需要的话,我还用文件的前两行创建了变量。你知道吗

编辑:如果正如评论员解释的那样,readlines()因为有无数行而无法完成这项工作,那么这里有一个返工,尽管它会跳过行,直到找到一个以一个数字开头的行,它假定这是一行数据:

reached_numbers = False
with open(r"C:\tmp\myfile.txt", 'r') as f:
    for line in (f):
        if reached_numbers:
            values = [ float(i) for i in line.strip().split(',') ]
            print "My function on", values, "returns", find_sum(values)
        else:
            reached_numbers = line[0].isdigit()

相关问题 更多 >