2016-08-01 35 views
0

Ich habe eine Datei mit dem Namen mcelog.conf und ich lese diese Datei in meinem Code. Inhalt der Datei istEine Zeile aus einer Datei in Python lesen

no-syslog = yes # (or no to disable) 
logfile = /tmp/logfile 

Programm die mcelog.conf Datei gelesen wird und wird für den no-syslog Tag überprüfen, ob no-syslog = yes dann Programm für den Tag logfile zu überprüfen hat und den logfile Tag gelesen. Kann mir jemand mitteilen, wie ich /tmp/logfile den Wert bekommen kann

with open('/etc/mcelog/mcelog.conf', 'r+') as fp: 
    for line in fp: 
     if re.search("no-syslog =", line) and re.search("= no", line): 
      memoryErrors = readLogFile("/var/log/messages") 
      mcelogPathFound = true 
      break 
     elif re.search("no-syslog =", line) and re.search("= yes", line): 
      continue 
     elif re.search("logfile =", line): 
      memoryErrors = readLogFile(line) # Here I want to pass the value "/tmp/logfile" but currently "logfile = /tmp/logfile" is getting passed 
      mcelogPathFound = true 
      break 
fp.close() 
+0

Haben Sie Regex-Gruppen ausprobiert? Oder sogar auf das Gleichheitszeichen aufteilen und im Wesentlichen ein Wörterbuch von Schlüsselwerten erstellen? –

+0

Nein, ich habe keine Regex-Gruppen ausprobiert. Wenn ich jede Zeile mit einem '=' - Zeichen aufspalte, besteht die Möglichkeit, dass, wenn einige Kommentare in der Datei vorhanden sind, eine Ausnahme auftritt. @ cricket-007 –

+0

Warum? Sie haben beide Antworten kommentiert, die Ihnen dasselbe sagen –

Antwort

1

Ändern Sie den Code zu:

with open('/etc/mcelog/mcelog.conf', 'r+') as fp: 
    for line in fp: 
     if re.search("no-syslog =", line) and re.search("= no", line): 
      memoryErrors = readLogFile("/var/log/messages") 
      mcelogPathFound = true 
      break 
     elif re.search("no-syslog =", line) and re.search("= yes", line): 
      continue 
     elif re.search("logfile =", line): 
      emoryErrors = readLogFile(line.split("=")[1].strip()) # Here I want to pass the value "/tmp/logfile" but currently "logfile = /tmp/logfile" is getting passed 
      mcelogPathFound = true 
      break 
fp.close() 

Dies ist, weil Sie nur einen Teil der Linie eher das Ganze lesen wollen, so habe ich spaltete es nur durch das Zeichen „=“ und beraubt es dann alle Rohlinge

+0

Als ich versuchte emoryErrors = readLogFile (line) .split ("=") [1] .strip() 'noch readLogFile Funktion übergibt das gleiche Argument" logfile =/tmp/logfile ". aber wenn ich passiere wie 'emoryErrors = readLogFile (line.split (" = ") [1] .strip())' dann funktioniert es gut. @ gaurav-dhama –

+0

Ja, ein Fehler meinerseits. Habe meine Antwort so geändert, dass sie dasselbe widerspiegelt. Ich hoffe, du hast die Idee. –

+0

Yeah hat die Idee und es funktioniert gut. Danke @ gaurav-dhama –

2

Sie spalten nur die Zeile mit dem gewünschten Wert zu erhalten:

line.split(' = ')[1] 

aber Sie könnten auf die Dokumentation aussehen soll für configparser module.

+0

Wenn ich 'emoryErrors = readLogFile (line.split (" = ") [1] .strip())' versuchte, dann funktioniert es gut. Danke @icart –

1

I mochte die Anregung des configparser Modul, so ist hier ein Beispiel dafür (Python 3)

Für die Eingabe zu entfernen, wird es Ausgang reading /var/log/messages

import configparser, itertools 
config = configparser.ConfigParser() 
filename = "/tmp/mcelog.conf" 

def readLogFile(filename): 
    if filename: 
     print("reading", filename) 
    else: 
     raise ValueError("unable to read file") 

section = 'global' 
with open(filename) as fp: 
    config.read_file(itertools.chain(['[{}]'.format(section)], fp), source = filename) 

no_syslog = config[section]['no-syslog'] 
if no_syslog == 'yes': 
    logfile = "/var/log/messages" 
elif no_syslog == 'no': 
    logfile = config[section]['logfile'] 

if logfile: 
    mcelogPathFound = True 

memoryErrors = readLogFile(logfile)