创建多个* .cfg文件Python

时间:2014-08-12 23:54:35

标签: python file-io

我正在使用* .cfg文件。该文件可以在gedit等文本编辑器中读取,并具有以下格式:

% some comments
VAR_1= 1
%
% More comments
ANOTHER_VAR= -8
%
% comments again
VAR_THE_COMEBACK= 10

我想创建多个配置文件,只需更改VAR_1 = 1 .... 2 ... 3 ......... 10。我设法在python中导入* cfg文件而没有任何新的导入,但是我没有办法改变这个参数,保存文件并为VAR_1创建另一个具有另一个值的文件。

我的代码到现在为止非常简单:

import os

os.chdir('/home/leonardo/Desktop')

f = open('file.cfg','r') #if I replace r by w I erase the file ....
a =  f.read()
print a.find('1')
a.replace('1','2') #I tried this but. ... :(

f.close()

任何提示?

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

未经测试的代码,但您会明白这一点:

with open('file.cfg', 'r') as f:
    contents_by_line = f.readlines()
    for var_index, line in enumerate(contents_by_line):
        if line.startswith("VAR_"):
            break
    else:
        raise RuntimeError("VAR_ not found in file")

for var_i, new_cfg_file in ((2,"file2.cfg"),
                              (3, "file3.cfg")): #add files as you want
   with open(new_cfg_file, "w") as fout:
       for i, line in enumerate(contents_by_line):
           if i == var_index:
               fout.write("VAR_1=%d\n" % var_i)
           else:
               fout.write(line)

答案 1 :(得分:0)

谢谢大家的帮助。我改变了我对问题的处理方法,因为线条将是全部相同的',我只是创建了一个新的行,并替换为我在堆栈中找到的函数。我希望有一天能帮助别人。

这个脚本将为我在大学的最终项目自动化一系列CFD模拟。它创建了一系列文件夹,在名称上有一些模拟条件,将网格文件复制到创建的文件夹以及新的配置文件,最后一行将运行代码,但我需要在基础模拟设置中运行以运行脚本。

代码正处于初步阶段,我将其更改为更具可读性且易于修改。

谢谢你们! 我欢迎任何提示,我试图提高我的编码技能:)。

代码:::

import fileinput
import os
import shutil
import subprocess

class stuff:
    root_folder = '/home/leonardo/Desktop/testzone'
    mini_mach = 0.3
    maxi_mach = 1.3
    number_steps = 3
    increment = ((maxi_mach-mini_mach)/number_steps)
    config_file = 'inv_NACA0012.cfg'
    parameter_1 = 'MACH_NUMBER= 0.8'
    parameter_2 = 'CONV_NUM_METHOD_ADJFLOW= JST'
    init_pa = 'MACH_NUMBER= ' #use a space after '='
    init_pa2 = 'CONV_NUM_METHOD_ADJFLOW= ' #use a space after '='
    airfoil = 'NACA0012'
    command1 = 'parallel_computation.py -f ' #use space before the last " ' "
    command2 = '-n 2'
    mesh_file = 'mesh_NACA0012_inv.su2'

class modify:
     def replaceAll(self,files,searchExp,replaceExp):
         for line in fileinput.input(files, inplace=1):
            if searchExp in line:
                line = line.replace(searchExp,replaceExp)
            sys.stdout.write(line)

mod = modify()
stuff = stuff()

for i in xrange(stuff.number_steps):
    mach_name = stuff.airfoil + '_mach_' + `float('%.2f'% stuff.mini_mach)` 
    folder_name = stuff.root_folder + '/' + mach_name
    print 'creating ...' + folder_name
    os.makedirs(folder_name)
    file_father = stuff.root_folder + '/' + stuff.config_file 
    shutil.copy2(file_father,folder_name)
    mesh_father = stuff.root_folder + '/' + stuff.mesh_file
    shutil.copy2(mesh_father,folder_name)
    os.chdir(folder_name)
    pre_mod_file = mach_name + '.cfg'
    os.renames(stuff.config_file,pre_mod_file)
    new_parameter_1 = stuff.init_pa + `float('%.2f'% stuff.mini_mach)`
    new_parameter_2 = stuff.init_pa2 + `float('%.2f'% stuff.mini_mach)`
    mod.replaceAll(pre_mod_file,stuff.parameter_1,new_parameter_1)
    mod.replaceAll(pre_mod_file,stuff.parameter_2,new_parameter_2)
    stuff.mini_mach += stuff.increment
    #subprocess.check_call(stuff.command + pre_mod_file + stuff.command2)