Replace Problemchen :)

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.
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

Wunderschönen Guten Morgen,
bin hier Neu im Forum :) Hab auch schon ne Dokumentation gelesen, aber ich habe ein Problem mit dem Replace. In meiner Datei steht ein Buchstabe mit X diesen will ich austauschen mit zum Beispiel Y leider Funktioniert es nicht so wie ich will.

Code: Alles auswählen

L = 4
if L == 4 :
  o = open ("Geschichte.txt", "w+")
  for line in open ("Geschichte.txt") :
  line = line.replace ( "X" , "Y" )
  o.write(line)
  o.close()
else:
 print "Fehler"
Liebe Grüße
euer Bluelagoon
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

Moin!

also, etwas ´funktioniert nicht so wie du willst` ist natürlich blöde, aber eine genauere Fehlermeldung ist immer gut. Am besten einfach die Fehlermeldung hier rein kopieren, die beim Ausführen kommt (und bei diesem Code kommen Fehlermeldungen!).

Ist das wirklich dein Code? Das erste Problem werden die Einrückungen sein. Dann schau dir mal das `with`-Statement an. Dann sehen wir weiter... ;)
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

mh ich weis nicht warum aber die Einrückungen hier sind anders angezeigt als in meiner Datei.
Fehler kommt keiner in der Datei stehn 2 Zeilen und wenn ich es ausführe werden Beide Zeilen gelöscht. Naja dann werde ich mich mal nach With umsehen


Grüße
Bluelagoon
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Es ist zumindest mutig eine Datei einmal zum schreiben und zum schreiben zu öffnen.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

Guck dir noch mal den Parameter zum öffnen der Datei an: http://docs.python.org/tutorial/inputou ... ting-files
BlackJack

Und dann vielleicht noch den Style Guide (PEP 8), was die Formatierung des Quelltextes angeht. Einrückung sollte zum Beispiel mit vier Leerzeichen pro Ebene passieren. Möglichst nicht mit Tabs.
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

Ah jetz hab ich den Fehler gefunden Vielen Lieben Dank :)

Code: Alles auswählen

L = 4
if L == 4 :
  o=open("geschichte.txt","r")
  for line in open("geschichte.txt"):
   line = line.replace ("X","5")
   o.close()
   print line
BlackJack

@bluelagoon: Das ist schon wieder falsch eingerückt. Und ob das `close()` an der richtigen Stelle steht…
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

es ist nur hier falsch keine Ahnung wie das hier geht. Auf jedenfall in Python Funktioniert es.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Ungetestet:

Code: Alles auswählen

from shutil import move

origin = 'foo.txt'

with open(origin) as f_in, open(origin+'.tmp','w') as f_out:
    for line in f_in:
        f_out.write(line.replace('X','Y'))

move(origin+'.tmp', origin)
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

Danke für deinen Code aber da kommt bei mir folgendes:

Code: Alles auswählen

 
 File "geschichten.py", line 11
    with open(origin) as f_in open(origin+'.tmp','w') as f_out:
                                 ^
SyntaxError: invalid syntax
Immerhin er hat meinen Befehl ausgeführt ich hab in der Datei aber nun immer diese Neue Zeile stehn. Gibt es einen Befehl die Vorherige Zeile zu Löschen?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Mensch, wie wichtig doch manchmal so ein kleines Komma sein kann ;-)
Das Leben ist wie ein Tennisball.
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

wenn ich das Komma schreib zeigt er das das nicht passt ;)
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

Code: Alles auswählen

  File "geschichten.py", line 11
    with open(origin) as f_in, open(origin+'.tmp','w') as f_out:
                                   ^
SyntaxError: invalid syntax

Sorry das verschiebt es hier so.. das steht unterm Komma..
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

Also wenn ich Print ausgebe passt das :) kann ich vll print mit stdout oder so umleiten? dann wäre ich Vollkommen mit meinem Test zufrieden :)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Ok, dann benutz du wahrscheinlich kein Python 3. Dann kannst du with with-Statements einfach in einander verschachteln:

Code: Alles auswählen

with open("spam") as spam:
    with open("eggs" as eggs:
        ...
Das Leben ist wie ein Tennisball.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

Code: Alles auswählen

L = 4
if L == 4  :
 for line in open("geschichten.txt"):
  o=open("geschichten.txt","r+w")
  lini = line.replace ("X","5")
  o.write(lini)
  o.close()
so siehts inzwischen bei mir aus und er schneidet mir einfach n paar Buchstaben weg :(
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

@jbs: 2.7 ist auch neuer als die ersten Versionen von 3.
@bluelagoon: Du kannst hier nicht in die Datei schreiben und gleichzeitig daraus lesen. Entweder liest du alle Zeilen vor dem Schreiben ein oder du erzeugst eine temporäre Datei. Das ständige Öffenen und Schließen von Dateien ist außerdem nicht besonders performat. Und benutze doch bitte Python-Code-Tags.
Das Leben ist wie ein Tennisball.
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

bluelagoon hat geschrieben:

Code: Alles auswählen

L = 4
if L == 4  :
 for line in open("geschichten.txt"):
  o=open("geschichten.txt","r+w")
  lini = line.replace ("X","5")
  o.write(lini)
  o.close()
Bitte benutze für Python-Code hier im Forum Python-Tags, statt Code-Tags.

Hast du eigentlich die Antworten auf deine Frage gelesen und verstanden? Du versuchst hier immer noch eine Datei zweimal zu öffnen und zwar einmal zum Lesen und einmal zum Lesen und Schreiben. Außerdem ist es nicht erforderlich, die zum Schreiben benutzte Datei für jede Zeile in der Quelldatei einmal zu öffnen und wieder zu schließen.

Der Weg sollte so sein, wie in den Antworten gezeigt:
1: Quelldatei öffnen - und zwar vorzugsweise unter Verwendung von with, denn damit wird sie am Ende des with-Blocks automatisch geschlossen.
2: Zieldatei öffnen - auch hier sollte with verwendet werden.
3. Alle Zeilen der Quelldatei durchgehen
3.1: Ggf. Text ändern
3.2: In Zieldatei schreiben

Zum Schluss kannst du dann noch die Quelldatei wegräumen und der Zieldatei den Namen der Quelldatei geben.
Antworten