Vorhandener Dateiinhalt wird vor dem Schreiben nicht gelösch

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.
Antworten
Dadapf
User
Beiträge: 28
Registriert: Mittwoch 16. Dezember 2009, 09:16

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
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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)
Dadapf
User
Beiträge: 28
Registriert: Mittwoch 16. Dezember 2009, 09:16

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
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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 ... :cry:
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Ich glaube der Hinweis auf PEP 8 ist hier dringend noetig: http://python.org/dev/peps/pep-0008/
BlackJack

Ich dampfe das trotzdem nochmal um eine Zeile ein:

Code: Alles auswählen

with open(zieldatei, "w") as outfile:
    outfile.writelines(data)
:-)
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

BlackJack hat geschrieben:Ich dampfe das trotzdem nochmal um eine Zeile ein
OK - das war in der Tat notwendig.
Dadapf
User
Beiträge: 28
Registriert: Mittwoch 16. Dezember 2009, 09:16

> 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
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

/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 ...
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
Dadapf
User
Beiträge: 28
Registriert: Mittwoch 16. Dezember 2009, 09:16

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
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
Dadapf
User
Beiträge: 28
Registriert: Mittwoch 16. Dezember 2009, 09:16

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
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

the more they change the more they stay the same
Dadapf
User
Beiträge: 28
Registriert: Mittwoch 16. Dezember 2009, 09:16

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
Antworten