Schlangenmensch hat geschrieben: Donnerstag 24. März 2022, 17:59
ich weiß, daß ich mit der primitiven Frage nerve, und ich auch den Rat bekomme erstmal ein paar Touturials durchzuarbeiten, aber leider bin ich ein sehr ungeduldiger Mensch und bräucht für mein Vorhaben noch einen kleinen Denkanstoss.
Auch wenn Du ein sehr ungeduldiger Mensch bist, möchte ich Dir wärmstens (!) ans Herz legen, zumindest das offizielle englischsprachige Tutorial unter [1] oder wenigstens das ein wenig veraltete, dennoch aber sehr brauchbare deutschsprachige Tutorial unter [2] einmal durchzuarbeiten.
Ich weiß, das erscheint Dir mühselig und wenig zielführend, und als Anfänger stehst Du beim Einstieg in die Programmierung ja auch vor einem ganz anderen Problem: Du mußt nämlich nicht nur eine Programmiersprache, sondern das Programmieren selbst lernen, und während Programmiersprachen im Wesentlichen nur ein bisschen Syntax, Grammatik und Vokabular sind, ist Programmieren gleichzeitig eine hohe Kunst und ein schwieriges Handwerk. Wer einmal Programmieren kann und womöglich auch mehrere Programmierparadigmen beherrscht, für den ist das Erlernen einer neuen Sprache in einem bekannten Paradigma nicht allzu schwierig. Aber das Programmieren selbst ist für Einsteiger der viel schwieriger zu erlernende Teil, den ein Anfänger aber auch nur dann bewältigen kann, wenn er dazu gleichzeitig mindestens eine Sprache lernt -- die Katze beißt sich also ein bisschen auch in den eigenen Schwanz.
Aber ich habe auch gute Neuigkeiten: wenn Du eines der beiden Tutorials durchgearbeitet hast -- und ich meine: nicht nur mal eben überflogen oder gelesen, sondern durchgearbeitet -- dann weißt Du viel mehr über die Sache und kannst dann auch wesentlich qualifiziertere und präzisere Fragen in einem Forum wie diesem hier stellen. Ich weiß, Dinge zu lernen, bevor man sie anwendet, ist unpopulär und anstrengend, und es sieht erst einmal viel einfacher aus, sich irgendeinen fremden Code aus dem Internet zu kopieren und dann so lange daran herum zu basteln oder ein Forum zu befragen, bis das Ganze dann funktioniert.
Aber wäre es nicht toll, wenn Du auch verstündest, was Du da tust? Wenn Du selbst genug über das Programmieren an sich und eine Programmiersprache wüßtest, daß Du beurteilen kannst, was Dein heruntergeladener Code macht, wie gut seine Qualität ist, ob er möglicherweise ein Sicherheitsrisiko für Deine Systeme, Deine Daten, oder Dich darstellt, oder -- ich wage es kaum zu schreiben -- wenn Du selbst in der Lage wärest, qualitativ hochwertigen Code zu schreiben, womöglich gar selbst etwas zu entwickeln?
Bitte, mach' das mit einem der Tutorials. Ich verspreche, daß Dir das nur ganz selten und ganz wenig weh tun wird, und daß Du hinterher froh sein wirst, das gemacht zu haben. Viel Spaß, viel Glück, und viel Erfolg!
[1]
https://docs.python.org/3/tutorial/
[2]
https://py-tutorial-de.readthedocs.io/de/python-3.3/
Schlangenmensch hat geschrieben: Donnerstag 24. März 2022, 17:59
Ich lese mit einem kleinen Programm einen Temperatursensor aus. Die Werte würde ich gerne auf einem USB Stick speichern, damit mir die Lese/Schreibzugriffe nicht zulasten der SD Karte vom Raspberry gehen.
Mit
file = open('/media/pi/0890-98df/Temperatur.txt', "w")
wird die Datei zwar erstellt, jedoch kann ich mit:
file.write("Hallo" + "\n")
michts in die Datei schreiben bzw. anhängen.
Du wurdest ja schon auf das with-Statement aufmerksam gemacht, das einen sogenannten Context Manager benutzt (bitte, mach' eins der Tutorials!), aber Dein Ansatz mit open(), write() und close() sollte natürlich auch funktionieren -- und ist manchmal sogar immer noch sinnvoll. Aber es gibt ein Problem: wenn die Datei im "normalen" Schreibmodus (w) geöffnet wird, dann zeigt der Schreibzeiger auf den Anfang der Datei, und der Inhalt der Datei ist verloren -- auch dann, wenn Du danach gar nichts in die Datei schreibst. Ja, ich weiß, das ist ein bisschen schwierig zu verstehen, aber so funktionieren Dateioperationen nun einmal, und der wesentliche Aspekt ist dabei nicht, was Du mit dem Dateihandle nach dem Öffnen machst, sondern, in welchem Modus Du die Datei öffnest. Das kleine 'w' macht also einen großen Unterschied, denn damit überschreibst Du de vorhandenen Inhalt Deiner Datei -- und zwar, wohlgemerkt: schon beim open(), und nicht erst mit write().
Wie dem auch sei: Du möchtest Deine Daten ja loggen, also über einen (womöglich längeren) Zeitraum sammeln. In diesem Fall kann es natürlich nicht die Idee sein, die Datei zu öffnen und dabei ihre Inhalte schon dabei zu löschen. Viel lieber möchtest Du doch ans Ende der vorhandenen Daten in Deiner Datei springen und Deine neue Daten dort anhängen, oder? Hey, gute Neuigkeiten, die Programmiergötter waren nicht doof und haben Dir deswegen einen eigenen Modus geschenkt. Der heißt aber nicht 'w', sondern 'a' (mnemonisch für "append" oder zu deutsch "anhängen"). Kurz gesagt, wenn Du in Deinem Programm schreibst:
Code: Alles auswählen
for i in range(3):
with open('eins.bla', 'w') as ofh:
ofh.write("%d\n"%(i))
hat Deine Datei "eins.bla" am Ende genau eine Zeile, in der der letzte Wert Deiner range() steht, also "2" -- weil der Dateiinhalt durch den Schreibmodus "w" bei jedem Öffnen gelöscht wurde. Wenn Du stattdessen jedoch jenes schreibst:
Code: Alles auswählen
for i in range(3):
with open('zwei.bla', 'a') as ofh:
ofh.write("%d\n"%(i))
hat Deine Datei am Ende drei Zeilen -- bei jedem Öffnen wurde der Schreibzeiger auf das Ende der Datei gesetzt, und der folgende write() hat dann hinter dieses Ende geschrieben, die geschriebenen Daten damit an die bereits vorhandenen angehängt, und die Datei dadurch effektiv um die neuen Daten vergrößert. Dieses Verhalten ist übrigens keine Besonderheit von Python, andere Sprachen machen das sehr ähnlich und viele sogar genau gleich.
Bitte tu Dir und uns hier jetzt den Gefallen und beschäftige Dich mit einem der oben genannten Tutorials. Vielen Dank, viel Erfolg, und viel Glück dabei!
