进行列表元素访问时的Python stange行为

时间:2016-10-10 02:30:59

标签: python list search file-io

这个小脚本完全符合我的需要。

#!/usr/bin/python

import os 
import fileinput
import sys
import shutil
import glob
import time

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


param1 = [1,2,3]
param2 = [1,2,3]
param3 = [1,2,3]


for i in xrange(len(param1)):
    for ii in xrange(len(param2)):
        for iii in xrange(len(param3)):

            os.system("cp -a cold.in input.in")

            old_param1 = "param1 = 1"
            old_param2 = "param2 = 1"
            old_param3 = "param3 = 1"

            new_param1 = "param1 = " + str(param1[i])
            new_param2 = "param2 = " + str(param2[ii])
            new_param3 = "param3 = " + str(param3[iii])

            replaceAll1('input.in',old_param1,new_param1)
            replaceAll1('input.in',old_param2,new_param2)
            replaceAll1('input.in',old_param3,new_param3)

            time.sleep(4)

它进入配置文件,并根据循环索引访问的列表顺序替换输入参数。它是彼此之间所有三个参数的简单组合。

# Input file
param1 = 1  # --- Should be [1,2,3]
param2 = 1  # --- Should be [1,2,3]
param3 = 1  # --- Should be [1,2,3]

问题在于他的大哥并不喜欢它。当它循环遍历列表时,它会在scheme = 2中丢失,并且当dissp_scheme = 1时将dissp_scheme = 2(冻结)。我打印出函数replaceAll中的每个变量,这些变量标记为注释但是当我打开时另一个人认为它搞砸了一切。这是脚本。

#!/usr/bin/python

import os
import fileinput
import sys
import shutil
import glob
import time

os.chdir(os.getcwd())



# Replaces the input file parameters

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

# Gets a number inside my input file.
def get_parameter(variable,file_name):
    f = open(file_name,'r').readlines()
    for i in xrange(len(f)):
        index = f[i].find(variable)
        if index != -1:
            pre_found = f[i].split('=')[1]
            return pre_found


# Gets the discretization scheme name.
def get_sheme(number):
    if number == 1:
        return "Simple Centered Scheme"
    elif number == 2:
        return "Lax-Wendroff Scheme"
    elif number == 3:
        return "MacCormack Scheme"
    elif number == 4:
        return "Beam-Warming Scheme"
    elif number == 5:
        return "Steger-Warming 1st Order Scheme"
    elif number == 6:
        return "Steger-Warming 2nd Order Scheme"
    elif number == 7:
        return "Van Leer 1st Order Scheme"
    elif number == 8:
        return "Van Leer 2nd Order Scheme"
    elif number == 9:
        return "Roe Scheme"
    elif number == 10:
        return "AUSM Scheme"


# Gets the dissipation scheme name.

def get_dissip(number):
    if number == 1:
        return "Pullian Non-Linear dissipation"
    elif number == 2:
        return "Second difference dissipation"
    elif number == 3:
        return "Fourth difference dissipation"
    elif number == 4:
        return "B&W dissipation"


# Generates the density gnuplot scripts.

def gnuplot(variable,pressure_ratio,scheme,dissip_scheme):

    #gnuplot('Density',10,get_sheme(3),'Pullian')

    # Building name of the output file.
    outFileName = variable.lower() + '_ratio' + str(int(pressure_ratio)) + '_' + scheme.replace(" ","") + '_dissp' + dissip_scheme.replace(" ","") + '.tex'
    gnuFileName = variable.lower() + '_ratio' + str(int(pressure_ratio)) + '_' + scheme.replace(" ","") + '_dissp' + dissip_scheme.replace(" ","") + '.gnu'

    # Build title of the plot
    title = 'Analytical vs Numerical | ' + scheme

    f = open(gnuFileName,'w')

    f.write("set term cairolatex monochrome size 15.0cm, 8cm\n")
    f.write('set output "' + outFileName + '"\n')
    f.write("set grid\n")
    f.write('set xtics font "Times-Roman, 10\n')
    f.write('set ytics font "Times-Roman, 10\n')
    f.write('set xlabel "x position" center\n')
    f.write('set ylabel "' + variable + '" center\n')
    f.write('set title "Analytical vs Numerical Results | ' + variable + '" \n')
    f.write('set pointsize 0.5\n')
    f.write('set key font ",10"\n')

    fortran_out_analytical = 'a' + variable.lower() + '.out'
    fortran_out_numerical  = variable.lower() + 'Output.out'

    f.write('plot "' + fortran_out_analytical +'" u 1:2 with linespoints lt -1 lw 1 pt 4 title "Analytical",\\\n')
    f.write( '"' + fortran_out_numerical + '" u 1:2 with lines lw 5 title "Numerical"\n')
    f.close()


# Generate latex code.

def generate_latex(text_image_file,caption):

    latex.write("\\begin{figure}[H]\n")
    latex.write("    \centering\n")
    latex.write("    \input{" + text_image_file + "}\n")
    latex.write("    \caption{"+ caption +"}\n")
    latex.write("    \label{fig:digraph}\n")
    latex.write("\\end{figure}\n")
    latex.write("\n\n")


# -----------------------------------------------------------------------
#                            Main loop.
# -----------------------------------------------------------------------

pressure_ratios = [5.0]
schemes = [1,2,3]
dissips = [1,2,3]

# Define replace lines for replace all.

scheme_line = "scheme = "
dissip_line = "dissp_scheme = "


# Open Latex export file.

latex = open("bizu.txt",'w')

i = 0

# ratios.
for i in xrange(len(pressure_ratios)):

    print "----------------------------------------"
    print " + Configuring File for pressure ratio: " + str(pressure_ratios[i])
    print "----------------------------------------\n"

    # Schemes
    for jj in xrange(len(schemes)):

        print " + Configuring file for scheme: " + get_sheme(schemes[jj]) + "\n"

        for kkk in xrange(len(dissips)):

            print " + Configuring file for dissip: " + get_dissip(dissips[kkk])

            # We always work with a brand new file.
            os.system("rm input.in")
            os.system("cp -a cold.in input.in")

            # Replace pressures.
            p1_line_old = 'p1 = 5.0d0'
            rho1_line_old = 'rho1 = 5.0d0' 

            p1_line_new = 'p1 = ' + str(pressure_ratios[i]) + 'd0'
            rho1_line_new = 'rho1 = ' + str(pressure_ratios[i]) + 'd0'

            replaceAll('input.in',p1_line_old,p1_line_new)
            replaceAll('input.in',rho1_line_old,rho1_line_new)


            # Replace discretization scheme.
            old_scheme = scheme_line + "1"
            new_scheme = scheme_line + str(schemes[jj])

            #==========================================================
            # This call is messing everything up when scheme turns to 2
            #==========================================================
            replaceAll('input.in',old_scheme,new_scheme)


            # Replace dissipation scheme.

            old_dissp_scheme = dissip_line + "1"
            new_dissp_scheme = dissip_line + str(dissips[kkk])

            print p1_line_old
            print new_scheme
            print new_dissp_scheme

            replaceAll('input.in',old_dissp_scheme, new_dissp_scheme)


            time.sleep(3)


#            ### Calling program
#            os.system("./sod")
#


latex.close()

它所使用的输入文件是:

&PAR_physical
    p1 = 5.0d0
    p4 = 1.0d0
    rho1 = 5.0d0
    rho4 = 1.0d0
    fgamma = 1.4d0
    R_const = 287.0d0
    F_Cp = 1004.5
    F_Cv = 717.5
/

&PAR_geometry

    total_mesh_points = 1001
    start_mesh_point = -5.0d0
    final_mesh_point = 5.0d0
    print_step = 100
/

&PAR_numeric
    scheme = 3
    iterations = 10000
    time_step = 0.0001d0
/

&PAR_dissip
    dissp_scheme = 3
    dissip_omega = 0.5d0
/

谢谢大家!

0 个答案:

没有答案