[Python] Fortran source file parsen

ikosaeder

Teekannen-Agnostiker
Hallo,
ich schlage mich seit einigen Tagen mit einem Problem rum. Ich muss in Fortrandateien einige use Statements abändern.
Beispiel:
Aus
Code:
! Fall 1
 use module1, ONLY :one,info, zero,half,dt, n_times, n_iter
soll
Code:
! Ziel:
  use module1, ONLY :info,dt, n_times, n_iter
  use module2, only: one, zero,half
werden.
Das habe ich im Griff (code siehe unten). Jetzt kann es aber auch folgenden Fall geben:
Code:
! Fall 2
! & markiert Zeilenfortsetzungen
 use module1, ONLY :one,info, zero,&
                                    half,dt, & 
                                    n_times, n_iter
Das Ergebnis soll das Gleiche wie oben sein.

Das habe ich bislang:
Python:
#!/usr/bin/python
import os,sys,re
try:
  filename=sys.argv[1]
  f = open( filename, 'rU')
  a = f.readlines()
  f.close()
except OSError, e:
  print "Input file could not be opened",e

UseLine= re.compile("^\s*USE\s*module1.*",flags=re.I)
module2=["zero","one","half"]
mod2variables=[]
mod1variables=[]
for i in range(len(a)):
  linefound=re.search(UseLine,a[i])
  if(linefound):
  b=a[i].split(":")
  c=b[1].split(",")
  try:
    for j in c:
      test=j.strip()
      if test in module2:
        mod2variables.append(test)
      else:
        mod2variables.append(test)
  except :
    pass
  if(len(mod2variables)>=1):
      modLine=(b[0]+":"+', '.join(mod1variables)).strip()
      modLine="     "+modLine+"\n"
      mod2Line='    USE module2, ONLY: '+', '.join(mod2variables)+"\n"
      a.remove(a[i])
      if(len(mod1variables)>=1):
         a.insert(i,modLine)
      a.insert(i+1,mod2Line)
      mod2variables[:]=[]
      mod1variables[:]=[]
try:
  f=open(filename,'wB')
  f.write("".join(a))
  f.close
except OSError, e:
  print "Output file could not be opened",e

Mein Problem ist, wie behandele ich die Fortsetzungszeilen im 2. Fall? Und, gibt es eine Alternative zu remove und insert, die meine Liste inplace verändern und damit auch die Länge der Liste, was zu unschönen Nebeneffekten bei der Verwendung eines Zählparameters i führt? (Oder eine sinnvolle Alternative zur Zählschleife?)

Vielleicht hat ja jemand eine gute Idee. Gerne auch in einer anderen Sprache als Python, wenn das Ergebnis nachvollziehbar ist.
 
Zurück