JavaScript ist deaktiviert. Für eine bessere Darstellung aktiviere bitte JavaScript in deinem Browser, bevor du fortfährst.
Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden.
Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.

[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.

Neue Beiträge

AltStyle によって変換されたページ (->オリジナル) /