Bestimmten String aus Datei lesen

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
Kaito90
User
Beiträge: 15
Registriert: Donnerstag 4. Juli 2013, 09:37

Hallo,

ich versuche gerade einen String aus einder Datei zu lesen, jedoch klappt das nicht immer.

In der Datei stehen einige Config::

pfad=c:\bla
nummer=01234567
nummera=07654321

Wenn ich mit Hilfe von regulären Ausdrücken arbeite, zeigt dieser mir die Zahl von nummer= an, wenn diese nicht vorhanden ist nummera. Ich möchte jedoch nur die Zahl von nummera haben. Die Namen in der Datei sind schon vorgegeben. Kann ich irgendwie sagen, suche nur nach nummera und gebe das nach dem = aus?

Vielen Dank
Kaito90
Benutzeravatar
noisefloor
User
Beiträge: 4253
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

wenn die Datei wirklich so aussieht, also ein Parameter pro Zeile, dann geht das mit startswith().

Also du iterierst über die Zeilen der Datei und prüfst, ob die Zeile mit `nummera` anfängt. Wenn ja splittest du bei `=` und dann hast du auch schon den Wert von `nummera`.

Falls du einen Einfluss auf die Dateistruktur haben solltest wäre es besser, wenn die Datei eine reguläre INI-Datei wäre, dann könntest du das configparser-Modul nutzen.

Gruß, noisefloor
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Hast du dir schon mal aus der Standard Library configparser angesehen?
Kaito90
User
Beiträge: 15
Registriert: Donnerstag 4. Juli 2013, 09:37

Ich danke schon mal für die Hilfe. Ich werde das mal mit dem startswith ausprobieren. Den Dateiaufbau und Typ kann ich leider nicht ändern, die werden so vorgegeben.
Benutzeravatar
noisefloor
User
Beiträge: 4253
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@/me: configparser funktioniert AFAIK nur, wenn in der Datei mindestens ein Section-Header vorhanden ist. Ist keiner da, wird ein MissingSectionHeaderError geworfen.

Gruß, noisefloor
BlackJack

@noisefloor: Falls die Datei ansonsten dem Format entspricht könnte man so einen Section-Header beim Einlesen ”einschmuggeln” und die `readfp()`-Methode vom Parser verwenden, die erwartet nämlich ein Objekt mit einer `readline()`-Methode:

Code: Alles auswählen

from itertools import chain


class prepend_section(object):

    def __init__(self, config_file, section_name='main'):
        self.lines = chain(['[{0}]\n'.format(section_name)], config_file)

    def readline(self):
        return next(self.lines, '')
Benutzeravatar
noisefloor
User
Beiträge: 4253
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@BlackJack: raffiniert... Muss ich später mal live ausprobieren. Die Theorie habe ich jedenfalls verstanden ;-)

`readfp()` heißt übrigens ab Python 3.2 `read_file()`, falls jemand P 3.2 oder neuer einsetzt.

Gruß, noisefloor
Kaito90
User
Beiträge: 15
Registriert: Donnerstag 4. Juli 2013, 09:37

Kam jetzt erst dazu es auszuprobieren und es läuft :)

Vielen Dank.
Antworten