Parameter durch Zahl ersetzen

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
rollo70
User
Beiträge: 6
Registriert: Donnerstag 16. Juli 2015, 14:03

Hi zusammen,

ich soll für einen Kollegen mit Python was schreiben und bin eher gerade in den Anfängen meiner Python Erfahrung unterwegs. Das Problem ist, dass ich ein Wort in einer 1000 Zeilen langen Text-Datei mit einer Zahl ersetzen muss. Die Zahl lese ich vorher aus einer anderen Datei ein. Hier als Beispiel wurde nun 7 genommen. Das Wort in der Datei soll demnach durch 7 ersetzt werden. Leider weiß ich nun nicht was ich ändern muss, damit ich es hinbekomme.

Code: Alles auswählen

import fileinput, sys

neu_Zahl = 7 <---an diesr Stelle erfolgt ein Code, der hier aus einer anderen Datei einen neuen Wert einfügt, als Beispiel nun 7

search_text = "Wort"
replace_text = "neu_Zahl"

for line in fileinput.input("test"):
     line = line.replace(search_text, replace_text)
     sys.stdout.write(line)
test Datei:

Code: Alles auswählen

Parameter
Parameter+3
Parameter
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Dein Beispiel ist in Zusammenhang mit der Beispieldatei total sinnlos, da in den Beispieldaten ja gar nicht "Wort" vorkommt. Was soll außerdem die Angabe von "neu_Zahl" einmal als Bezeichner und einmal als Zeichenkette? Dir ist schon klar, dass das eine nichts mit dem anderen zu tun hat?

Davon ab: Was genau funktioniert denn in deinem echten Programm nicht? Das zeilenweise Durchlaufen der Textdatei und die Anwendung von `replace()` erscheinen mir soweit korrekt. Du müsstest schon etwas zeigen, was deinem tatsächlichen Code / Problem näher kommt.

Außerdem brauchst du das `fileinput`-Modul in deinem Fall überhaupt nicht. Die Verwendung von `open()` würde völlig ausreichen. Würde man z.B. mal das offizielle Python-Tutorial durcharbeiten, dann wüsste man sowas...
rollo70
User
Beiträge: 6
Registriert: Donnerstag 16. Juli 2015, 14:03

Oh, bittte um Entschuldigung, so besser:

Code: Alles auswählen

import fileinput, sys
neu_Zahl = 7 <---an diesr Stelle erfolgt ein Code, der hier aus einer anderen Datei einen neuen Wert einfügt, als Beispiel nun 7
search_text = "Wort"
replace_text = neu_Zahl

for line in fileinput.input("test"):
     line = line.replace(search_text, replace_text)
     sys.stdout.write(line)
test Datei:

Code: Alles auswählen

Wort
Wort+1
Wort
Ich kenne mich kaum aus in Python oder generell dem Programmieren.
Der Fehler ist :
line = line.replace(search_text, replace_text)
TypeError: Can't convert 'int' object to str implicitly
Da ich keine Ahnung habe und auch nur das Kurze Programm schreiben muss, dachte ich wende mich an euch.
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Wie die Fehlermeldung sagt, übergibst du str.replace eine Zahl.
Es erwartet als ersten und zweiten Parameter jedoch eine Zeichenkette.

Du solltest bei der Wertzuweisung von replace_text eine Konvetierung des Wertes vornehmen. Also konvertiere int in str. Gute Schlagwörter zum finden der Lösung sind kursiv.

Edit:
von neu_Zahl auf replace_text gewechselt.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@rollo70: `replace()` kann (sinnvollerweise) nur mit Zeichenketten umgehen. Deine 7 ist aber eine Zahl. Denk vielleicht mal selber nach, wie du hier Abhilfe schaffen könntest... ;)
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

sparrow hat geschrieben:Also konvertiere int in str.
Wahrscheinlich ist das nicht mal nötig. Denn laut Beschreibung aus dem Eröffnungsbeitrag wird der Zahlwert ebenfalls aus einer Datei gelesen. Dann kann man auch komplett bei Strings bleiben, ohne zwischengeschaltete Konvertierungen.
Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

Python 3. Schau mal, ob du diesen Quelltext verstehst:

Code: Alles auswählen

# Variablen 1
suchwort = str(7)
ersetzung = "sieben"

quelldatei = "datei.txt"
zieldatei = quelldatei.split(".")[0] + ".neu.txt"

dateiinhalt = []

# Quelldatei öffnen und durchlaufen
with open(quelldatei) as f:

    for line in f:

        line = line.replace(suchwort, ersetzung)
        
        dateiinhalt.append(line)


# Dateiinhalt in die Zieldatei schreiben
with open(zieldatei, "w") as f:

    f.write("".join(dateiinhalt))
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@pixewakb: Was spricht dagegen, sofort in die Zieldatei zu schreiben?

Ungetestet:

Code: Alles auswählen

with open('quelle.txt') as source:
    with open('ziel.txt', 'w') as dest:
        for line in source:
            dest.write(line.replace(old, new))
Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

Macht der Gewohnheit. Bei mir liegen zwischen dem Einlesen von Daten und der Ausgabe i. d. R. erhebliche Arbeitsschritte, weshalb ich das häufig trenne - liegt mir gedanklich auch noch näher, d. h. da bin ich gedanklich noch nicht so weit.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@pixewakb: Dann sollte man diese Zwischenschritte aber möglichst mithilfe eines Generators erledigen, d.h. die einzelnen Zeilen via `yield` herumreichen. Andernfalls macht man sich den Vorteil des zeilenweisen Einlesens zumindest hinsichtlich des Speicherverbrauchs ja wieder zunichte, da durch die Liste am Ende doch wieder alles im Speicher landet.

Und falls man wirklich mal eine Liste von Zeilen benötigt, dann kann man auch gleich die `readlines()`-Methode des `file`-Objekts nutzen. Die liefert nämlich genau eine solche Liste zurück. Oder alternativ schlichtweg: ``list(f)`` (wenn `f` das `file`-Objekt ist).
BlackJack

@pixewakb: Auf jeden Fall kann man sich das ``''.join(…)`` vor'm schreiben sparen und einfach die `writelines()`-Methode mit der Liste (oder dem Generator) verwenden.
Antworten