# [Python] Fortran source file parsen



## ikosaeder (18. März 2015)

Hallo,
ich schlage mich seit einigen Tagen mit einem Problem rum. Ich muss in Fortrandateien einige use Statements abändern. 
Beispiel:
Aus

```
! Fall 1
 use module1, ONLY :one,info, zero,half,dt, n_times, n_iter
```
soll

```
! 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:

```
! 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:

```
#!/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.


----------



## ikosaeder (25. März 2015)

Hat denn keiner eine Idee?


----------

