Seite 1 von 1

Parameter durch Zahl ersetzen

Verfasst: Donnerstag 16. Juli 2015, 14:23
von rollo70
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

Re: Parameter durch Zahl ersetzen

Verfasst: Donnerstag 16. Juli 2015, 14:39
von snafu
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...

Re: Parameter durch Zahl ersetzen

Verfasst: Donnerstag 16. Juli 2015, 14:49
von rollo70
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.

Re: Parameter durch Zahl ersetzen

Verfasst: Donnerstag 16. Juli 2015, 14:56
von sparrow
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.

Re: Parameter durch Zahl ersetzen

Verfasst: Donnerstag 16. Juli 2015, 15:14
von snafu
@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... ;)

Re: Parameter durch Zahl ersetzen

Verfasst: Donnerstag 16. Juli 2015, 15:16
von snafu
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.

Re: Parameter durch Zahl ersetzen

Verfasst: Donnerstag 16. Juli 2015, 15:46
von pixewakb
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))

Re: Parameter durch Zahl ersetzen

Verfasst: Donnerstag 16. Juli 2015, 16:46
von snafu
@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))

Re: Parameter durch Zahl ersetzen

Verfasst: Freitag 17. Juli 2015, 11:33
von pixewakb
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.

Re: Parameter durch Zahl ersetzen

Verfasst: Freitag 17. Juli 2015, 11:46
von snafu
@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).

Re: Parameter durch Zahl ersetzen

Verfasst: Freitag 17. Juli 2015, 12:03
von 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.