Bedingtes Ersetzen in Datei

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
Art7400
User
Beiträge: 2
Registriert: Samstag 2. Juli 2011, 15:31

Hallo zusammen,

zwar bin ich erst vor sehr Kurzem unter die Programmierer (eher: unter die blutigen Anfänger, die gegen so ziemlich jede Programmier-Mauer rennen) gekommen, konnte jedoch durch passive Nutzung des Foums schon machens Mal kleine Erfolge vermelden. Jetzt komme ich jedoch nicht weiter...

Mein Problem sieht wie folgt aus:
Ich habe eine ".txt"-Datei, in der viele verrückte Dinge stehen.

Code: Alles auswählen

#--------------------------------
#---------- file.txt -------------
...
bla, bla, bla
das und das
<Anfang:>
12.3; 14.5
44.3; 4.5
<Ende>
dies und das
...
#--------------------------------
Nun möchte ich in der gesamten Datei, unter der Bedingung, dass ich mich zwischen "<Anfang:>" und "<Ende>" befinde, eine Ersetzung vornehmen. Aus den Zahlen mit Dezimalpunkt sollen Zahlen mit Komma werden: 12.3->12,3, 14.5->14,5, ...
Wie das reine Ersetzen laufen sollte, ist mir, denke ich, klar:

Code: Alles auswählen

#--------------------------------
#------- replace.py -----------
import fileinput, sys

for line in fileinput.input("file.txt",inplace=1):
     line = line.replace(PlatzhalterString, ErsetzString)
     sys.stdout.write(line)
#--------------------------------
Wie jedoch steuere ich, dass die Ersetzung nur dann stattfinden soll, wenn ich mich im genannte Bereich (zwischen "<Anfang:>" und "<Ende>") befinde?
Vielleicht hat ja einer von euch eine passende Idee?

Vielen Dank
Art7400
Zuletzt geändert von Art7400 am Samstag 2. Juli 2011, 16:03, insgesamt 1-mal geändert.
problembär

Art7400 hat geschrieben:Wie jedoch steuere ich, dass die Ersetzung nur dann stattfinden soll, wenn ich mich im genannte Bereich (zwischen "<Anfang:>" und "<Ende>") befinde?
Na, von Hand:

Code: Alles auswählen

#!/usr/bin/env python

a = """#--------------------------------
#---------- file.txt -------------
...
bla, bla, bla
das und das
<Anfang:>
12.3; 14.5
44.3; 4.5
<Ende>
dies und das
...
#--------------------------------"""

a = a.split("\n")

x = False
for i in a:
    if i == "<Anfang:>":
        x = True
        continue
    if i == "<Ende>":
        x = False
    if x:
        print i
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Eine wichtige Frage: Kann es sein, dass diese Marker verschachtelt werden? Also dass zum Beispiel 2 Mal der Anfang-Tag kommt, dann Text, dann ein End-Tag, nochmal Text und noch ein End-Tag. Dann musst du die Verschachtelungsebene hochzählen bzw. wieder abziehen (wie bei verschachtelten Klammern in einem Term).
Art7400
User
Beiträge: 2
Registriert: Samstag 2. Juli 2011, 15:31

derdon hat geschrieben:Eine wichtige Frage: Kann es sein, dass diese Marker verschachtelt werden? Also dass zum Beispiel 2 Mal der Anfang-Tag kommt, dann Text, dann ein End-Tag, nochmal Text und noch ein End-Tag. Dann musst du die Verschachtelungsebene hochzählen bzw. wieder abziehen (wie bei verschachtelten Klammern in einem Term).
Nein, das sollte nicht passieren. Vielen Dank bis dahin. Werde oben Genanntes mal einbauen.

Art7400
deets

Aber bitte wenn moeglich mit etwas deskriptiveren Variablennamen. Wie "zeile" statt "i", und "ersetze" statt "x"....
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@Art7400: Wenn in deiner Datei mehrere <Anfang:>...<Ende> Blocks hintereinander vorkommen können, würde ich es zB. so machen:

Code: Alles auswählen

text = '''
#--------------------------------
#---------- file.txt -------------
...
bla, bla, bla
das und das
<Anfang:>
12.3; 14.5
44.3; 4.5
<Ende>
dies und das
...
#--------------------------------
'''

def unchanged(line):
    return modified if line == '<Anfang:>' else unchanged, line

def modified(line):
    return unchanged if line == '<Ende>' else modified, line.replace('.', ',')

transmogrify = unchanged
for line in text.split('\n'):
    transmogrify, line = transmogrify(line)
    print(line)
Wenn es in der Datei nur einen einzigen solchen Block gibt, kann man sich nach dem <Ende> die Tests sparen:

Code: Alles auswählen

def unchanged_test(line):
    return modified if line == '<Anfang:>' else unchanged_test, line

def modified(line):
    return unchanged if line == '<Ende>' else modified, line.replace('.', ',')

def unchanged(line):
    return unchanged, line

transmogrify = unchanged_test
#Rest wie oben
In specifications, Murphy's Law supersedes Ohm's.
Antworten