Dateien aus Template und Variablen generieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
timetrinus
User
Beiträge: 2
Registriert: Mittwoch 7. April 2010, 20:46

Hallo Leute,

ich stehe ein wenig auf dem Schlauch. Ich muss aus mehreren Templatedateien und einer Konfigurationsdatei unterschiedliche Zieldateien erzeugen. Der Aufbau einer Zeile innerhalb des Templates ist in etwa so:

nfsroot=@@STAGE:stage-p@VAR:nfsroot@@ serverip=10.221.1.99 ARGS=soft,nosync @@STAGE:stage-p@VAR:config@@


Im Ziel müsste die Zeile dann so aussehen:

nfsroot=nfsroot-p-20100407-001 serverip=10.221.1.99 ARGS=soft,nosync configspace-p-20100403-002


Die Konfigurationsdatei sieht da wie folgt aus:
[stage-p]
nfsroot=nfsroot-p-20100407-001
config=configspace-p-20100403-002

[stage-t]
nfsroot=nfsroot-p-20100406-001
config=configspace-p-20100403-002

Ich denke, dass das irgendwie mit re gemacht werden kann / muss. Nur leider stehe ich vollkommen auf dem Schlauch. Kann wer helfen?
problembär

timetrinus hat geschrieben:Ich muss aus mehreren Templatedateien und einer Konfigurationsdatei unterschiedliche Zieldateien erzeugen.
Na und, ich nicht.
nfsroot=@@STAGE:stage-p@VAR:nfsroot@@ serverip=10.221.1.99 ARGS=soft,nosync @@STAGE:stage-p@VAR:config@@
Sagt mir gar nichts.
Kann wer helfen?
Könnte schon, hab' aber keine Lust.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

@problembär: Schlecht drauf?
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
BlackJack

@timetrinus: Das `re`-Modul und das `ConfigParser`-Modul solltest Du Dir mal anschauen.

Oder wo war jetzt die konkrete Frage?
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

BlackJack hat geschrieben:@timetrinus: Das `re`-Modul und das `ConfigParser`-Modul solltest Du Dir mal anschauen.
Statt `ConfigParser`lieber `configobj` ( http://www.voidspace.org.uk/python/configobj.html )
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
timetrinus
User
Beiträge: 2
Registriert: Mittwoch 7. April 2010, 20:46

BlackJack hat geschrieben:@timetrinus: Das `re`-Modul und das `ConfigParser`-Modul solltest Du Dir mal anschauen.

Oder wo war jetzt die konkrete Frage?
Ja, das `re`-Modul hatte ich schon befürchtet. Mit re.findall finde ich ja auch die betreffenden Zeilen. Aber ich müsste das ja wie folgt machen:

1. suche nach @@[0-9a-zA-Z-]*@[0-9a-zA-Z-]*@@
2. Zerlege den gefundenen Teilstring: stage=value1, var=value2
3. Ermittle für stage den Wert von var aus der Konfig
4. ersetze das gesamte Konstrukt @@[0-9a-zA-Z-]*@[0-9a-zA-Z-]*@@ durch den ermittelten Wert für var

Soweit die therorie. Ich bekomme es aber in der Praxis nicht hin und bin für Hilfe dankbar.
philistion
User
Beiträge: 108
Registriert: Sonntag 7. Februar 2010, 14:16

Reichen re.findall, re.split, re.sub und die restlichen Hinweise in der re-Hilfe nicht aus?

Poste mal deinen aktuellen Code, dann kann man korrigieren wenn du was falsch gemacht hast.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Na, dann habe ich mal erbamen. Du willst REs, du bekommst REs:

Code: Alles auswählen

import re

s = """
[stage-p] 
nfsroot=nfsroot-p-20100407-001 
config=configspace-p-20100403-002 

[stage-t] 
nfsroot=nfsroot-p-20100406-001 
config=configspace-p-20100403-002
"""

conf = {}

for line in s.splitlines():
    m = re.match(r'^\[(.*?)\]\s*$', line)
    if m: section = m.group(1); conf[section] = {}; continue
    m = re.match(r'^(.*?)\s*=\s*(.*?)\s*$', line)
    if m: conf[section][m.group(1)] = m.group(2)

s = "nfsroot=@@STAGE:stage-p@VAR:nfsroot@@ " +\
    "serverip=10.221.1.99 ARGS=soft,nosync @@STAGE:stage-p@VAR:config@@"

print(re.sub(
    r'@@STAGE:(.*?)@VAR:(.*?)@@', 
    lambda m:conf[m.group(1)][m.group(2)],
    s))
Stefan
BlackJack

Ich würde den Gruppen in dem RE noch Namen geben, dann wird's IMHO etwas lesbarer. Insbesondere wenn RE und Funktion mal nicht so dicht zusammen stehen.

Code: Alles auswählen

import re
from ConfigParser import ConfigParser


def main():
    template = ('nfsroot=@@STAGE:stage-p@VAR:nfsroot@@ serverip=10.221.1.99'
                ' ARGS=soft,nosync @@STAGE:stage-p@VAR:config@@')
    expected = ('nfsroot=nfsroot-p-20100407-001 serverip=10.221.1.99'
                ' ARGS=soft,nosync configspace-p-20100403-002')
    
    config = ConfigParser()
    config.read('test.cfg')
    
    result = re.sub(r'@@STAGE:(?P<stage>.*?)@VAR:(?P<var>.*?)@@',
                    lambda m: config.get(m.group('stage'), m.group('var')),
                    template)
    print result
    print result == expected


if __name__ == '__main__':
    main()
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Lesbar war nicht mein Ziel. Ich wollte alles mit REs machen... :)
Antworten