Как скопировать файл, но изменить несколько параметров внутри? - PullRequest
2 голосов
/ 13 января 2012

Я использую python как интерфейс для нескольких файлов fortran в моей модели. Я хочу дублировать файл Фортрана несколько раз, но в каждой копии я буду изменять параметры, которые описывают мою модель.

Например: у меня есть файл с фортраном ниже

!file.f
! This is a fortran code

!Parameters
alpha = 0.5
beta = 100
...

Я хочу скопировать file.f несколько раз, чтобы у меня были file1.f, file2.f, file3.f и т. Д. Однако при каждом дублировании файла я хочу автоматически изменять параметры alpha и beta. Спасибо

РЕДАКТИРОВАТЬ: Позвольте мне объяснить немного дальше. Я использую Python для реализации ассимиляции данных (фильтрация Калмана) для моделей, которые уже были разработаны в Фортране. В основном, как это работает, на каждом заданном временном шаге модели Фортрана перестают работать, затем я интегрирую данные реального мира в данные модели и делаю это на python. Затем после интегрирования (ассимиляции) я повторно запустил те же модели, но на этот раз, используя новые параметры, которые я получил из объединения данных из модели и наблюдений и новых начальных условий. Я использую Python, чтобы делать все, кроме запуска модели, которая выполняется Fortran.

Ответы [ 4 ]

4 голосов
/ 13 января 2012

Я думаю, что наиболее последовательным способом было бы использовать шаблонизатор. В Python их много, обычно они развертываются в веб-приложениях.

Но целью движков шаблонов является именно то, чтобы позволить одному иметь большую часть кода, который должен быть заменен как статический текст, и с помощью специальной разметки интерполировать это с переменными, сгенерированными в коде Python.

В зависимости от сложности ваших параметров вам даже может не понадобиться какой-либо отдельный шаблонизатор, и вы можете просто использовать возможности форматирования строк Python, как в примере ниже.

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

Пример - напишите свой шаблон fortram что-то вроде:

!file.f
! This is a fortran code

!Parameters
alpha = %(alpha)s
beta = %(beta)s

А в коде Python напишите что-то вроде:

template = open("fortram_template.for", "rt").read()
data = {"alpha": 0.5, "beta": 100}

with open("fortram_1.for", "wt") as output:
    output.write (template % data)
2 голосов
/ 13 января 2012

Решением на Фортране может быть запись строк параметров в отдельном текстовом файле, а затем include этого файла в исходном коде на Фортране со строкой, подобной этой:

include 'parameters.inc'

Таким образом, вы можете просто восстановить файл параметров, не касаясь файла, содержащего основной код Фортрана.

2 голосов
/ 13 января 2012

Вот пример того, что вы могли бы сделать.Я поместил различные (альфа, бета) пары в список alpha_betaalpha_beta я выбираю использовать индекс позиции пары в качестве значения, которое увеличивает имя файла, но есть множество способов сделать это.Этот код хрупок в том смысле, что он предполагает многое о вашем файле .f, но так как он предназначен для вашего личного использования при создании этих файлов, я думаю, вы будете в порядке (например, я полагаю, основываясь на предоставленной вами информации, чтотолько один экземпляр слова альфа в начале строки в вашем файле - если это не так, вам лучше использовать регулярное выражение).

alpha_beta = [(0.1, 16), (0.9, 50), (0.4, 76)]
file_name = 'file'
file_ext = '.txt'

for index, vars in enumerate(alpha_beta, start=1):
    with open(file_name + file_ext) as f:
        alpha, beta = vars
        new_file = open(file_name + str(index) + file_ext, 'w')
        for line in f:
            if line.startswith('alpha'):
                new_file.write('alpha = %s \n' % str(alpha))
            elif line.startswith('beta'):
                new_file.write('beta = %s \n' % str(beta))
            else:
                new_file.write(line)
        new_file.close()
1 голос
/ 13 января 2012

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

  1. Считайте параметры, которые будут использоваться из временного входного файла,что-то вроде:

    !file.f
    !This is a fortran code
    
    !Parameters
    open (unit=input, file='tmp_inp.txt', action='read', iostat=ierr)
    read (input, '(...)') alpha, beta
    

    Затем измените значения во временном входном файле из Python или с помощью sed.

  2. Передайте параметры в качестве аргументов подпрограмме fortran изнутриPython, путем сопряжения кода Fortran с Python с использованием f2py.Код Fortran выглядит следующим образом:

    !file.f
    !This is a fortran code
    subroutine my_sub(alpha, beta)
    ...
    

    Затем скомпилируйте с помощью f2py:

    f2py -c -m my_fortran_code file.f
    

    И, наконец, вызовите из Python как:

    #python code
    from my_fortran_code import my_sub
    my_sub(alpha, beta)
    

Оба решения не требуют перекомпиляции какого-либо кода Fortran только для изменения нескольких входных параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...