14 Stimmen

Konfigurationsdatei mit Python bearbeiten

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 Zeilen in der Datei ersetzen und Übereinstimmungen in meiner Suche durchführen muss.

Auch, was ich gefunden deckt, wie es für eine Zeile zu tun, werde ich mindestens 8 Zeile Ersetzungen in der Datei durchführen, und ich möchte wissen, ob es eine sauberere und elegantere Art und Weise, dies zu tun, als 10 ersetzen (foo, bar) Zeilen insgesamt setzen.

Ich muss Zeilen wie "ENABLEPRINTER", "PRINTERLIST", "PRNT1.PORT" "abgleichen". Ich möchte diese Texte abgleichen und alles, was darauf folgt, ignorieren (z. B. "=PRNT1, PRNT2").

Ich würde also etwas tun wie

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

Die Datei sieht wie folgt aus:

ENABLEPRINTER=n
PRINTERLIST=PRNT1, PRNT2

PRNT1.PORT=9600
PRNT1.BITS=8

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

Herzlichen Dank für Ihre Hilfe.

UPDATE :

Wenn ich den von @J.F. Sebastian geposteten Code verwende, erhalte ich jetzt den folgenden Fehler:

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

Zeile 611 der Datei lautet:

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

Das Problem liegt also in dem Zeichen '.

Wenn ich diese Zeile auskommentiere, funktioniert das Skript mit dem von @J.F. Sebastian geposteten Code einwandfrei.

7voto

eyquem Punkte 25545
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()

Vorher:

ENABLEPRINTER=n 
PRINTERLIST=PRNT1, PRNT2  

PRNT1.PORT=9600 
PRNT1.BITS=8

Danach:

y=n 
PRNT3==PRNT1, PRNT2  

734=9600
PRNT1.BITS=8

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

Der Vorteil von Regexen ist, dass sie leicht an bestimmte Fälle angepasst werden können.

.

EDIT:

Das habe ich gerade gesehen:

"Ich möchte der Variablen einen neuen Wert zuweisen".

Sie könnten das früher mitteilen!

Könnten Sie bitte ein Beispiel für eine Vorher/Nachher-Datei geben?

.

EDIT 2

Hier ist der Code zum Ändern der Werte bestimmter Variablen in einer Datei:

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)

Vorher:

ENABLEPRINTER=n 
PRINTERLIST=PRNT1, PRNT2  

PRNT1.PORT=9600 
PRNT1.BITS=8

Danach:

ENABLEPRINTER=y 
PRINTERLIST=PRNT3

PRNT1.PORT=8310 
PRNT1.BITS=8

4voto

jfs Punkte 370717

Wenn die Datei in java.util.Properties Format, dann könnten Sie verwenden 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'))

Sie ist nicht sehr robust, aber verschiedene Korrekturen könnten den nächsten Nutzern zugute kommen.


Mehrfaches Ersetzen in einer kurzen Zeichenkette:

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

Um Variablennamen in einer Konfigurationsdatei zu ersetzen (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 durch replace('ENABLEPRINTER', 'y') Sie meinen zuweisen y zum ENABLEPRINTER dann variabel:

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 configobj ist nicht kompatibel mit:

name = '.'something

Sie könnten es zitieren:

name = "'.'something"

Oder:

name = '.something'

O

name = .something

conf.update() macht etwas Ähnliches wie:

for name, value in [('ENABLEPRINTER', 'y'), ('PRINTERLIST', 'PRNT3')]:
    conf[name] = value

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X