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

hm ja aber das mit dem With versteh ich nicht so ganz :(
BlackJack

@bluelagoon: Wenn Du eine Datei mit '+' zum schreiben öffnest steht der Dateizeiger auf dem Anfang der Datei. Da wird dann auch jede Zeile mit Deinen Ersetzungen hingeschrieben und überschreibt was auch immer da steht.

Auf ein und der selben Datei gleichzeitig lesend und schreibend zugreifen, sollte man nur machen, wenn man weiss was man da tut. In der Regel geht das nur bei Binärdateien gut -- bei Textdateien sollte man das sein lassen.
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

ok also + raus :)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

EyDu hat geschrieben:@jbs: 2.7 ist auch neuer als die ersten Versionen von 3.
Das heisst aber noch nicht automatisch dass es auch rueckportiert wird.

Daneben gibt es auch noch `contextlib.nested`

Code: Alles auswählen

with nested(open("one"), open("two") as (one, two)):
    pass
Der Grund fuer `with` ist, dass es die Dateien nach dem Block wieder aufraeumt und du dich nicht darum kuemmern musst.

Zum Erzeugen der temporaeren Datei gaebs auch noch das `tempfile` Modul.

PEP 8 waere auch noch lesenswert.
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

naja ich brauch eig keine Temporäre Datei ich wollt einfach nur bissl Doku Üben und irgendwie häng ich voll weil unter print schreibt er das was ich will aber wenn ich in Datei schreiben will dann is die Datei leer (gut das ich Kopie von datei hab die ganzen 20 Zeilen nochmal Tippen wär eine Qual ^^)

liebe Grüße
BlueLagoon
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

bluelagoon hat geschrieben:hm ja aber das mit dem With versteh ich nicht so ganz :(
Schau mal unter http://www.python-forum.de/viewtopic.ph ... 78#p178478.
BlackJack

@bluelagoon: Nein, nicht '+' raus. Dann wird die Datei wenn sie zum Schreiben geöffnet wird komplett geleert und die äussere Schleife hat keine Zeilen mehr zum Lesen.

Du brauchst eben *doch* eine temporäre Datei. Schreiben und Lesen auf der gleichen Textdatei funktioniert eben so nicht.
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

was gebt ihr ein das der Code so Farbig wird?
naja ich habs mit with probiert aber ich will nur einen Buchstaben austauschen und replace nimmt er nicht an.

Traceback (most recent call last):
File "geschichten.py", line 11, in <module>
f=f.replace("X","Y")
AttributeError: 'file' object has no attribute 'replace'

ich weis langsam nicht mehr weiter :( gibts überhaupt replace in python oder heisst die funktion vll anders? ich hab zwar replace bei google gefunden aber vielleicht gibts ne bessere Methode.
BlackJack

@bluelagoon: Es gibt über dem Textfeld eine Schaltfläche wo `python` draufsteht. Die fügt das ein, womit man Python-Quelltexte hier farbig machen kann.

Alternativ kann man bei den Code-Tags beim öffnenden Tag aus dem code ein code=python machen.

`replace()` gibt es auf Zeichenketten. Du versuchst das auf einem Dateiobjekt. Du musst den Inhalt schon einlesen um den Buchstaben austauschen zu können.
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

ahh man bin ich blind lol :D

+brett vorm kopf+ x.x
also so sieht die Datei aus:

Code: Alles auswählen

L = 4
if L == 4  :
 with open("geschichten","r") as f:
  print f.read()
  with open("geschichten","w")as f:
   f=f.replace("X","Y")
   print f.read()
   f.close()
so: ich habs auch schon andersrum probiert spricht write oben read unten aber er hat einfach dieses problemchen mit replace langsam denk ich ich bin einfach nur blöd das zu verstehn.
BlackJack

@bluelagoon: Wie oft wurde Dir denn nun eigentlich schon gesagt, dass Du nicht die selbe Textdatei gleichzeitig zum Lesen und Schreiben öffnen sollst!? :roll: Beide Dateiobjekte an den gleichen Namen zu binden ist selbst wenn das gehen würde, nicht so schön. Und das Schliessen der Datei übernimmt das ``with``, das braucht man also nicht selber zu machen.

Die `read()`-Methode liest den Dateiinhalt ein. Wenn Du damit etwas machen möchtest, solltest Du ihn vielleicht an einen Namen binden. Und lesen kann man nur von Dateien, die auch zum Lesen geöffnet wurden.

Hör doch mal auf die Ratschläge und gehe ein wenig systematischer an die Sache heran. Teile das Problem in kleine Teilprobleme auf und löse diese.
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

der erste teil funktioniert mit print also das Lesen nur das Schreiben da ist meine Datei immer leer.
BlackJack

@bluelagoon: Dann machst Du irgendetwas falsch. *Was* kann man ohne Quelltext schlecht sagen.
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

Code: Alles auswählen

if L == 4 :
  o=open("geschichten.txt","w+")
  for line in open("Märchen.txt"):
      line=line.replace ("X","Y")
      o.write(line)
      print line
  o.close()
und siehe da es klappt :) danke ihr lieben

lg euer bluelagoon
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Jetzt fehlt nur noch das with-Statement, auf welches du etwas 27 hingewiesen wurdest. Dann werden auch alle Dateien korrekt geschlossen ;-)
Das Leben ist wie ein Tennisball.
Antworten