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

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

ups ja stimmt werd ich machen Danke :D
Antworten