Seite 1 von 1

Bedingtes Ersetzen in Datei

Verfasst: Samstag 2. Juli 2011, 15:54
von Art7400
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

Re: Bedingtes Ersetzen in Datei

Verfasst: Samstag 2. Juli 2011, 16:03
von 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

Re: Bedingtes Ersetzen in Datei

Verfasst: Samstag 2. Juli 2011, 16:06
von derdon
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).

Re: Bedingtes Ersetzen in Datei

Verfasst: Samstag 2. Juli 2011, 16:09
von Art7400
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

Re: Bedingtes Ersetzen in Datei

Verfasst: Samstag 2. Juli 2011, 17:16
von deets
Aber bitte wenn moeglich mit etwas deskriptiveren Variablennamen. Wie "zeile" statt "i", und "ersetze" statt "x"....

Re: Bedingtes Ersetzen in Datei

Verfasst: Sonntag 3. Juli 2011, 02:54
von pillmuncher
@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