python: write schreibt nicht in Datei

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • python: write schreibt nicht in Datei

    Hallo!
    Hab vor kurzem entschlossen das es wieder Zeit ist mal was zu programmieren und mir ein Python Buch geholt! :) Jetzt bin ich auf mein erstes Problem gestoßen... und Google hilft mir leider nicht weiter!

    Folgendes minimalbeispiel:

    Quellcode

    1. fobj = open("text.txt", mode="w", encoding="utf8")
    2. fobj.write("bla\n")
    3. fobj.close

    Erstellt die datei text.txt, allerdings ohne Inhalt! Schreibe ich mit einem externen Editor etwas in die Datei wird der Inhalt überschrieben (was ok ist), allerdings wird "bla\n" nicht hinzugefügt. Ändere ich "w" in "a" bleibt Text welcher in der Datei ist bestehen, "Bla" wird allerdings nicht angehängt. Weglassen von encoding führt zum selben Ergebnis

    Bytesstream schreiben ändert auch nix:

    Quellcode

    1. fobj = open("text.txt", mode="w+b")#, encoding="utf8")
    2. fobj.write("bla\n".encode("utf8"))89
    3. fobj.close


    Ich benutze OS X.9.2 und Python 3.4.0.
    Hat jemand ne Idee was ich falsch mache? ?(

    Und wie es so oft ist wenn man ein Problem beschreibt bin ich selber auf die Lösung gekommen: Ich hab die klammern bei fobj.close() vergessen.... :whistling: Ich poste es mal trotzdem falls jemand das selbe Problem hat!

    Danke!

    /edit: Aber vielleicht weis ja jemand warum das keine Fehlermeldung gibt?!
  • close ist eine Funktion, also musst Du sie auch aufrufen. Zumindest hier. fobj.close()

    Keine Ahnung, was "entwickler" mit seinem Kommentar sagen will.

    BTW seit Python 2.7 (und 2.6 mit future) kann man "with" benutzen:

    Quellcode

    1. with open('text.txt','w','utf8') as fobj:
    2. fobj.write(...)
    C++
  • zerm schrieb:

    Keine Ahnung, was "entwickler" mit seinem Kommentar sagen will.

    :) Na, ich hab mich nur auf die tatsächliche Fehlerzeile gestürtzt und diese geändert.
    Nicht

    Quellcode

    1. fobj = open("text.txt", mode="w", encoding="utf8")

    sondern

    Quellcode

    1. fobj = open("text.txt", "w", "utf8")

    also ohne den Parameternamen nochmals zu nennen.

    das fobj.close() habe ich gar nicht wahrgenommen.
    Ist in dem Fall aber auch egal, da mit dem Programmende auch automatisch das fobj gelosed werden sollte.
    Aber Du hast Recht. Der Vollständigkeit halber mit Klammer auf/zu.

    zerm ist grantig.
  • zerm schrieb:

    Die Zeile sollte aber korrekt sein?


    ? Jetzt verstehe ich Dich nicht. Ja, die Klammer gehört dazu. Aber in seinem Fall war die fehlende Klammer nicht das Problem, da das fobj beim Beenden des Scripts automatisch geclosed werden sollte, es sei denn python hat ein uraltes Leak. Meine Variante sollte deswegen funktionieren.
    Aber ganz ehrlich, ich weiß nicht, warum bei ihm auf dem Rechner eine text.txt liegt... ich vermute mal, er hat sie irgendwann selbst erstellt und wollte zumindest gucken, ob dort was reingeschrieben wird.... wäre die Datei im Schreibmodus erstellt/geöffnet worden, hätten die weiteren Befehle auch was geschrieben. Wobei am Ende ein fobj.close() natürlich sauberer gewesen wäre.
  • Hilf mir mal, im stehe auf dem Schlauch. Seine Zeile,
    fobj = open("text.txt", mode="w", encoding="utf8")
    ist in meinen Augen absolut korrekt (Python 3, Python 2 hat noch kein encoding parameter).

    Soweit ich das sehe, ist sein ganzes Programm korrekt. (Bis auf das falsche .close)
    C++
  • zerm schrieb:

    (Bis auf das falsche .close)

    Hat er ja inzwischen auch selber als Fehler erkannt und eingeräumt.

    Gogul schrieb:

    /edit: Aber vielleicht weis ja jemand warum das keine Fehlermeldung gibt?!

    Dieser Ausdruck liefert Dir die Referenz auf die close-Methode, und ist somit kein Fehler. Schreib' mal ein print davor, und schau Dir die Ausgabe an. ;)
    „Meine Komplikation hatte eine Komplikation.“
  • Die documentation sagt: open(name[, mode[, buffering]])
    docs.python.org/2/library/functions.html#open
    python 3
    open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True)
    docs.python.org/3.2/library/fu….html?highlight=open#open

    Ich habe nie mit python 3 gearbeitet... zerm hat da dann zusätzlich Recht, sein Programm (von Gogol) ist oben richtig, abgesehen von den Klammern.
    Hier gerade unter Mavericks getestet, da ist es python 2.7.5.
    mit fobj.close geht es, wie von mir vermutet. nur das encoding darf man nicht übernehmen.

    Nachtrag: auch unter python 2.7.5 geht es mit
    fobj = open("test.txt",mode="w")




    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von entwickler ()

  • Danke Leute! Wenn die Datei nicht geschlossen wird, wird nichts (!) in die Datei geschrieben! Sonst wär mir das erstmal garned aufgefallen! ;) (Code in IDLE3 ausgeführt)

    @macmoonshine: Hat das mit print inzwischen auch ausprobiert, ist quasi die Adresse im Speicher an welcher der Code für die Methode steht, richtig?!

    <built-in method close of _io.TextIOWrapper object at 0x103553048>
  • Gogul schrieb:

    Danke Leute! Wenn die Datei nicht geschlossen wird, wird nichts (!) in die Datei geschrieben! Sonst wär mir das erstmal garned aufgefallen! (Code in IDLE3 ausgeführt)

    okay. wieder was dazu gelernt. unter 2.7.5 wird der String in die Datei geschrieben.
    Unter 3.x wird es ja anders gehandhabt. Meine Erwartungshaltung wäre aber das bei einem normalen Ende des Scripts (kein kill signal/fatal error) ein cleanup durchgeführt wird. In dem Fall, falls nicht schon geschehen, writebuffer durch das Schreiben der Daten entleeren und Datei/Speicher freigeben.