Есть ли эффективный способ передачи аргументов функции из входного файла? - PullRequest
0 голосов
/ 23 января 2019

Я проверяю, как различные переменные влияют на модель с использованием развертки параметра.Я пытаюсь прочитать параметры из текстового файла и передать их в функцию, в которой рассчитывается модель, возвращается ответ и вывод.

Например, если у меня есть входной файл с именем параметра в качестве первогостроки и последовательные строки как комбинации параметров, которые я хотел бы вычислить:

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 и корректировать значения каждый раз после прочтения файла или есть лучший способ?


EDIT1:

Я отредактировал вопрос, добавив большее количество параметров, которые известны в текстовом файле и константах.Было бы лучше создать объект параметра и редактировать значения объекта для каждого прохода в функцию.

Имейте в виду, что, хотя в данном примере функция является суммой, в реальной программе она будет намного сложнее, вероятно, вызывая другие функции только с подмножеством параметров.Например

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

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Есть несколько способов сделать это.Если этой первой строки в файле не было, то вы можете просто обработать файл как файл .csv (верхняя строка «param1, param2, param3» - это заголовок, а последующие строки - значения, разделенные запятыми дляэти три столбца).В Python уже есть легкодоступные модули, которые будут считывать и записывать данные в файлы CSV и из них.Вы можете прочитать об этом здесь .

В вашем конкретном случае ваш файл начинается с одной строки данных, за которыми следуют заголовки 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()
0 голосов
/ 23 января 2019

Используйте 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(',')))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...