Bearbeiten Sie die Konfigurationsdatei durch python

Ich muss eine Konfigurationsdatei durch Python bearbeiten und ich habe versucht, auf stackoverflow und google zu suchen und sie decken meine Situation nicht ab, da ich die Zeilen in der Datei ersetzen und in meiner Suche durchführen muss.

Auch, was ich gefunden deckt, wie es für eine Zeile zu tun, werde ich mindestens 8 Zeilen Ersatz in der Datei und ich würde gerne wissen, ob es eine sauberere und elegantere Art und Weise zu tun, als Putting 10 ersetzen (foo , Bar) Linien insgesamt.

Ich muss "zusammenpassen" Linien wie "ENABLEPRINTER", "PRINTERLIST", "PRNT1.PORT". Ich möchte mit dem Text übereinstimmen und ignorieren, was folgt (zB: "= PRNT1, PRNT2").

Also würde ich so etwas machen

replace('ENABLEPRINTER', 'y') replace('PRINTERLIST', 'PRNT3) 

Die Datei sieht so aus:

 ENABLEPRINTER=n PRINTERLIST=PRNT1, PRNT2 PRNT1.PORT=9600 PRNT1.BITS=8 

Beachten Sie auch diese Dateien sind etwa 100 Zeilen und ich muss etwa 10 von ihnen bearbeiten.

Vielen Dank für Ihre Hilfe.

UPDATE :

Mit dem Code von @JF Sebastian gepostet, bekomme ich jetzt die folgende Fehler:

 configobj.ParseError: Parse error in value at line 611. 

Zeile 611 der Datei ist:

 log4j.appender.dailyRollingFile.DatePattern='.'yyyy-MM-d 

Also das Problem ist mit dem Charakter.

Wenn ich diese Zeile kommentiere, funktioniert das Skript gut mit dem Code, der von @JF Sebastian veröffentlicht wurde.

    2 Solutions collect form web for “Bearbeiten Sie die Konfigurationsdatei durch python”

     import re pat = re.compile('ENABLEPRINTER|PRINTERLIST|PRNT1.PORT') def jojo(mat,dic = {'ENABLEPRINTER':'y', 'PRINTERLIST':'PRNT3', 'PRNT1.PORT':'734'} ): return dic[mat.group()] with open('configfile','rb+') as f: content = f.read() f.seek(0,0) f.write(pat.sub(jojo,content)) f.truncate() 

    Vor:

     ENABLEPRINTER=n PRINTERLIST=PRNT1, PRNT2 PRNT1.PORT=9600 PRNT1.BITS=8 

    Nach:

     y=n PRNT3==PRNT1, PRNT2 734=9600 PRNT1.BITS=8 

    Zu einfach, endgültig zu sein. Sag, was sind die Fehler oder Schwächen.

    Der Vorteil von regexes ist, dass sie leicht zu bestimmten Fällen moduliert werden können.

    .

    BEARBEITEN:

    Ich habe gerade gesehen, dass:

    "Was ich tun möchte, ist der Variablen einen neuen Wert zuzuordnen"

    Sie können dies früher informieren!

    Könnten Sie bitte ein Beispiel der Datei vor / nach, bitte.

    .

    BEARBEITEN 2

    Hier ist der Code, um die Werte bestimmter Variablen in einer Datei zu ändern:

     import re from os import fsync def updating(filename,dico): RE = '(('+'|'.join(dico.keys())+')\s*=)[^\r\n]*?(\r?\n|\r)' pat = re.compile(RE) def jojo(mat,dic = dico ): return dic[mat.group(2)].join(mat.group(1,3)) with open(filename,'rb') as f: content = f.read() with open(filename,'wb') as f: f.write(pat.sub(jojo,content)) #----------------------------------------------------------- vars = ['ENABLEPRINTER','PRINTERLIST','PRNT1.PORT'] new_values = ['y','PRNT3','8310'] what_to_change = dict(zip(vars,new_values)) updating('configfile_1.txt',what_to_change) 

    Vor:

     ENABLEPRINTER=n PRINTERLIST=PRNT1, PRNT2 PRNT1.PORT=9600 PRNT1.BITS=8 

    Nach:

     ENABLEPRINTER=y PRINTERLIST=PRNT3 PRNT1.PORT=8310 PRNT1.BITS=8 

    Wenn die Datei in java.util.Properties Format ist, dann könnten Sie pyjavaproperties :

     from pyjavaproperties import Properties p = Properties() p.load(open('input.properties')) for name, value in [('ENABLEPRINTER', 'y'), ('PRINTERLIST', 'PRNT3')]: p[name] = value p.store(open('output.properties', 'w')) 

    Es ist nicht sehr robust, aber verschiedene Korrekturen für sie könnten Menschen, die als nächstes kommen, profitieren.


    Um mehrere Male in einer kurzen Zeichenfolge zu ersetzen:

     for old, new in [('ENABLEPRINTER', 'y'), ('PRINTERLIST', 'PRNT3')]: some_string = some_string.replace(old, new) 

    So ersetzen Sie Variablennamen in einer Konfigurationsdatei (mit configobj Modul ):

     import configobj conf = configobj.ConfigObj('test.conf') for old, new in [('ENABLEPRINTER', 'y'), ('PRINTERLIST', 'PRNT3')]: conf[new] = conf[old] del conf[old] conf.write() 

    Wenn Sie durch replace('ENABLEPRINTER', 'y') bedeuten Sie y zu der Variable ENABLEPRINTER dann:

     import configobj ENCODING='utf-8' conf = configobj.ConfigObj('test.conf', raise_errors=True, file_error=True, # don't create file if it doesn't exist encoding=ENCODING, # used to read/write file default_encoding=ENCODING) # str -> unicode internally (useful on Python2.x) conf.update(dict(ENABLEPRINTER='y', PRINTERLIST='PRNT3')) conf.write() 

    Es scheint, dass configobj nicht kompatibel mit:

     name = '.'something 

    Du könntest es zitieren:

     name = "'.'something" 

    Oder:

     name = '.something' 

    Oder

     name = .something 

    conf.update() tut etwas Ähnliches wie:

     for name, value in [('ENABLEPRINTER', 'y'), ('PRINTERLIST', 'PRNT3')]: conf[name] = value 
    Python ist die beste Programmiersprache der Welt.