Seite 1 von 1
Vorhandener Dateiinhalt wird vor dem Schreiben nicht gelösch
Verfasst: Donnerstag 17. Dezember 2009, 19:26
von Dadapf
Guten Abend,
Daten sollen in eine Datei geschrieben werden. Wenn die Datei bereits vorhanden ist, soll der vorhandene Inhalt gelöscht werden, damit nur die neuen Daten verbleiben. Eigentlich sollte es so gehen:
Code: Alles auswählen
Datei = file(Zieldatei, u'w')
for i in range(0,len(ReduzierteRohliste)):
Datei.write(ReduzierteRohliste [i])
Datei.close()
Doch der vorhandende Inhalt wird nicht gelöscht und die neuen Daten einfach hinten angehängt - als ob statt 'w' 'a' stehen würde. Sieht jemand den Fehler?
Dadapf
Re: Vorhandener Dateiinhalt wird vor dem Schreiben nicht gel
Verfasst: Donnerstag 17. Dezember 2009, 19:48
von /me
Dadapf hat geschrieben:Doch der vorhandende Inhalt wird nicht gelöscht und die neuen Daten einfach hinten angehängt - als ob statt 'w' 'a' stehen würde. Sieht jemand den Fehler?
Ich kann das Problem nicht nachvollziehen. Bist du sicher, dass deine Liste das enthält was du erwartest?
Schöner sieht das übrigens so aus
Code: Alles auswählen
with open(zieldatei, "w") as fp:
for data in reduzierte_rohliste:
fp.write(data)
Verfasst: Donnerstag 17. Dezember 2009, 19:59
von Dadapf
Vielen Dank für`s Nachdenken. Die Liste und die gezeigte Zeilen sind in Ordnung und tuen das, was sie sollen.
Der Fehler lag bei meiner Fehlersuche.
Es werden vom Programm insgesamt drei Dateien erzeugt. Zwei mit obiger Routine, die dritte mit einer anderen, selbstgeschriebenen - allerdings mit der Anweisung "anhängen". Ich habe die dritte Datei kontrolliert und vergessen, dass sie eine andere Schreibroutine als die ersten beiden hat.
Entschuldigung.
Dadapf
p.s.: Der Dreizeiler ist natürlich besser als mein Vierzeiler. Danke
Verfasst: Donnerstag 17. Dezember 2009, 20:38
von numerix
Dadapf hat geschrieben:p.s.: Der Dreizeiler ist natürlich besser als mein Vierzeiler. Danke
Aber nicht, weil er eine Zeile kürzer ist. Dein Code ist durch und durch unpythonisch. Da geht die ganze Eleganz von Python flöten ...

Verfasst: Donnerstag 17. Dezember 2009, 20:50
von cofi
Ich glaube der Hinweis auf PEP 8 ist hier dringend noetig:
http://python.org/dev/peps/pep-0008/
Verfasst: Donnerstag 17. Dezember 2009, 21:04
von BlackJack
Ich dampfe das trotzdem nochmal um eine Zeile ein:
Code: Alles auswählen
with open(zieldatei, "w") as outfile:
outfile.writelines(data)

Verfasst: Donnerstag 17. Dezember 2009, 22:18
von /me
BlackJack hat geschrieben:Ich dampfe das trotzdem nochmal um eine Zeile ein
OK - das war in der Tat notwendig.
Verfasst: Freitag 18. Dezember 2009, 12:41
von Dadapf
> Da geht die ganze Eleganz von Python flöten ...
Und Eleganz ist bekanntlich sehr subjektiv.
Ich habe meine Gründe, warum ich "Funktion(x)" und "Feld (x)" anstatt "function(x)" oder "func(x)" und "field(x)" schreibe. Bei den denglischen Grausamkeiten, die ich hier manchmal im Forum gesehen habe, dreht es mir den Magen um. Aber ich denke mir: Der Programmautor muss damit leben und täglich arbeiten ... Wenn er es konsequent durchzieht, finde ich es in Ordnung.
PEP8 kenne ich bereits. Teilweise stimme ich dem dort Geschrieben voll zu, teilweise bin ich einfach anderer Meinung.
Dadapf
Verfasst: Freitag 18. Dezember 2009, 12:46
von Pekh
/me hat geschrieben:BlackJack hat geschrieben:Ich dampfe das trotzdem nochmal um eine Zeile ein
OK - das war in der Tat notwendig.
Er dampft nicht nur ein, sondern erweitert zugleich noch den Funktionsumfang. (-> Fehlerbehandlung)

Das ist fein. Ich wünschte, solche Effizienzsteigerungen wären im Alltag öfter drin ...
Verfasst: Freitag 18. Dezember 2009, 12:51
von EyDu
Dadapf hat geschrieben:> Da geht die ganze Eleganz von Python flöten ...
Und Eleganz ist bekanntlich sehr subjektiv.
Ich habe meine Gründe, warum ich "Funktion(x)" und "Feld (x)" anstatt "function(x)" oder "func(x)" und "field(x)" schreibe. Bei den denglischen Grausamkeiten, die ich hier manchmal im Forum gesehen habe, dreht es mir den Magen um. Aber ich denke mir: Der Programmautor muss damit leben und täglich arbeiten ... Wenn er es konsequent durchzieht, finde ich es in Ordnung.
PEP8 kenne ich bereits. Teilweise stimme ich dem dort Geschrieben voll zu, teilweise bin ich einfach anderer Meinung.
Dadapf
Hallo.
Es geht auch nicht nur um die Namen: du solltest open statt file verwenden und außerdem kannst du direkt über Listen iterieren und brauchst keinen Umweg über Listen. Und wenn du deinen Code hier zeigst und Hilfe brauchst, dann empfiehlt es sich, sich an den Standard zu halten. Dann haben wir es nämlich leichter.
Verfasst: Freitag 18. Dezember 2009, 13:04
von Dadapf
Ich sage ja nicht, dass ich keine Kritik annehmen kann oder nicht lernfähig bin. Um etwas zu ändern, muss es für mich einen hinreichenden Grund geben.
Zum open und file habe ich das Forum bereits hoch und runter gelesen, doch nichts nichts finden können, was explizit gegen file spricht.
Über Listen zu interieren ist in obigen Fall kürzer. Ich werde es mir zu Gemüte führen. Die Listen-Schleifen sind halt sonst mein Standardansatz (gewesen) und die Struktur kopiere ich dann einfach in so eine kurze Routine.
Trotzdem danke für die Anregungen.
Dadapf
Verfasst: Freitag 18. Dezember 2009, 13:31
von /me
Dadapf hat geschrieben:Zum open und file habe ich das Forum bereits hoch und runter gelesen, doch nichts nichts finden können, was explizit gegen file spricht.
Zusätzlich zum Lesen des Forums bietet sich auch immer das Lesen der Dokumentation an. Hier findest du unter
http://docs.python.org/library/functions.html#file folgenden Satz: "When opening a file, it’s preferable to use open() instead of invoking this constructor directly. file is more suited to type testing (for example, writing isinstance(f, file)).".
Das "with" verbessert die Sache dann noch in Richtung einer sinnvollen Fehlerbehandlung.
Dadapf hat geschrieben:Über Listen zu interieren ist in obigen Fall kürzer.
Es ist nicht nur kürzer, es sagt auch genau das aus was du tun möchtest (wobei die Variante von BlackJack hier natürlich angebrachter ist). Es ist nicht sinnvoll Konstrukte aus anderen Sprachen zwangsweise in Python zu verwenden wenn es doch deutlich bessere Sprachkonstrukte dafür gibt.
Man muss natürlich bereit sein, sich auf Python wirklich einzulassen. Meine ersten Python-Programme sehen jetzt im Rückblick betrachtet ziemlich grausam aus (ich war verseucht von C++ und PHP). Jetzt, wo ich einige davon im Nachinein refaktoriere merke ich erst, was für eine Effektivität und Eleganz man an manchen Stellen mit Python erreichen kann.
Verfasst: Freitag 18. Dezember 2009, 17:03
von Dadapf
Ist bei dem with-Konstrukt die close-Anweisung nicht nötig, oder einfach nur unter den Tisch gefallen? Ich bekomme weder so noch so eine Fehlermeldung, denke aber, es wäre sinnvoll die Datei zu schließen.
Den Hinweis von Pekh über die Fehlerbehandlung habe ich zwar noch nicht verstanden - vielleicht kommt es noch im Laufe meines Lebens.
Dadapf
Verfasst: Freitag 18. Dezember 2009, 17:07
von Dav1d
Verfasst: Freitag 18. Dezember 2009, 17:33
von Dadapf
Danke David,
ich habe damals noch mit Python 2.4 gelernt, "with" hat es da noch nicht gegeben.
Und jetzt sind wir bereits bei Python 3. Bei nächster Gelegenheit muss ich mir ein neues Buch kaufen - habe gerne was zwischen den Fingern.
Dadapf