Schreiben in File mit while Schleife

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
pcdoc
User
Beiträge: 7
Registriert: Mittwoch 16. April 2014, 22:07

Hallo,

Ich muss in eine Datei einen Wert schreiben. Das funktioniert auch problemlos, solange ich das einmal mache. Jedoch muss ich alle paar Sekunden einen anderen Wert in die Datei schreiben (Ansteuerung von GPIOs).

Zu Testzwecken hab ich was ganz einfaches geschreiben und zwar, dass alle 2 Sekunden eine 0 bzw. eine 1 in das Textfile geschrieben wird. Das würde dann HW seitig ein Ein- bzw. Ausschalten von irgendwas gleichkommen. Jedoch funktioniert das dann doch nicht so einfach wie ich mir das vorgestellt habe....

Code: Alles auswählen

import sys
import time

i=0

f=open("d:\\test.txt", "w")
while i==10:
    f.write("1")
    time.sleep(2)
    f.write("0")
    time.sleep(2)
    i=i+1
f.close()
Es gibt keine Fehlermeldung, nur steht in der Datei garnichts mehr drin. Auch nicht wenn vorher etwas drin stand.

Der Code ist nur eine von vielen Varianten die ich versucht hab. Auch bei while True: endet das Program sofort. Auch wenn ich open und close in die While-Schleife mit reinschreibe für jeden write Befehl bringt das nichts.....

Ich bin mir sicher es kann nur einen Kleinigkeit sein, aber offensichltich bin ich heute schon zu müde und auch nach mehreren Versuchen hab ich das nicht hinbekommen.

Danke schon mal!

mfg
Andreas
Zuletzt geändert von pcdoc am Mittwoch 16. April 2014, 23:05, insgesamt 1-mal geändert.
BlackJack

@pcdoc: Der Schleifenkörper wird solange ausgeführt wie `i` den Wert 10 hat — also *nie*.

Hier würde sich auch eher eine ``for``-Scheife anbieten, dann kann man sich das initialisieren von `i` vor der Schleife und das manuelle hochzählen am Schleifenende sparen.
pcdoc
User
Beiträge: 7
Registriert: Mittwoch 16. April 2014, 22:07

Hallo,

Wie gesagt auch bei einer Dauerschleife mit True geht leider nichts. Ich habs auch schon mit <=10 versucht. Also nur daran liegts sicher nicht, aber du hast schon recht, war nicht unbedingt der beste Versuch den ich gepostet habe mit i==10! :-)

mfg
Andreas
BlackJack

@pcdoc: Was heisst „geht leider nichts”? Bei der Bedingung ``i <= 10`` sind am Ende des Programms Zeichen in der Datei. Wenn Du *während* des Programmablaufs, also vor dem `close()` etwas in der Datei haben möchtest, dann musst Du dafür sorgen das die Daten auch tatsächlich *sofort* geschrieben werden, und nicht erst wenn der Pufferspeicher voll ist. Dafür ist die `flush()`-Methode da.
pcdoc
User
Beiträge: 7
Registriert: Mittwoch 16. April 2014, 22:07

Wie gesagt auch nach Ablauf war nichts in dem File.

Ich hatte es auch schon so:

Code: Alles auswählen

import sys
import time

i=0


while i<=10:
    f=open("d:\\test.txt", "w")
    f.write("0")
    f.close()
    time.sleep(2)
    f=open("d:\\test.txt", "w")
    f.write("1")
    f.close()
    time.sleep(2)
    i=i+1
Nur brachte das leider auch keinen Erfolg, obwohl es meiner Meinung nach so gehen müsste. Deshalb bin ich ja etwas ratlos... Und das dürfte auch keinen Unterschied machen ob Python 2 oder 3....

mfg
Andreas
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Du schreibst 11 mal eine Datei mit einer "0" und ueberschreibst die Datei dann mit einer die eine "1" enthaelt.

Schau dir mal an, was das "w" Argument fuer `open` bedeutet. Und dann solltest du noch `with` fuer den Umgang mit Dateien benutzen.
pcdoc
User
Beiträge: 7
Registriert: Mittwoch 16. April 2014, 22:07

cofi hat geschrieben:Du schreibst 11 mal eine Datei mit einer "0" und ueberschreibst die Datei dann mit einer die eine "1" enthaelt.
Nagut, ich programmiere noch nicht lange, aber der 2. code den ich gepostet habe würde meiner Meinung nach was anderes machen. Und zwar würde er alle 2 Sekunden die Datei neu schreiben und zwar abwechselnd mit 0 und 1. Wieso meinst du ich schreibe 11 mal eine Datei mit 0? Aber selbst wenn das so wäre (was ich ehrlich gesagt anzweifle) darf es trotzdem nicht sein, dass am Ende nur ein komplett leeres File da ist.
cofi hat geschrieben:Schau dir mal an, was das "w" Argument fuer `open` bedeutet. Und dann solltest du noch `with` fuer den Umgang mit Dateien benutzen.
w = write, oder liege ich da falsch? Dh die Datei wird neu geschrieben. Und das ist ja auch der Zweck. Wenn ich damit falsch liege, bitte um Aufklärung. With werde ich mir anschauen.

mfg
Andreas
BlackJack

@pcdoc: In der Datei steht etwas. Da *muss* nach Ablauf des Programms eine 1 drin stehen.
pcdoc
User
Beiträge: 7
Registriert: Mittwoch 16. April 2014, 22:07

Gestern war das leider nicht der Fall, es stand nichts drinnen, es war ein leeres TXT File in jedem Fall.

Ich habe es heute nochmal versucht und jetzt gehen plötzlich alle Möglichkeiten wieder. Ich kann echt nicht sagen woran es gestern gelegen hat, da ich zu heute nichts verändert habe. Eventuell der Neustart, ich weiß es wirklich nicht. Aber jetzt funktioniert wie gesagt alles wieder, egal ob mehrere Werte in ein File schreiben, das File jedesmal mit einem bestimmten Wert neu schreiben oder auch einfach was dazu zu schreiben....

Naja, hoffentlich war das ein einmaliges Problem...

Danke nochmal für eure Hilfe!

mfg
Andreas
BlackJack

Das letzte Programm noch mal mit Hauptfunktion, ``for``-Schleife(n), ohne Quelltextwiederholung, mit ``with``, und einem Namen für die Datei der nicht nur aus einem Buchstaben besteht:

Code: Alles auswählen

from time import sleep


def main():
    for _ in xrange(11):
        for value in ['0', '1']:
            with open(r'd:\test.txt', 'w') as out_file:
                out_file.write(value)
            sleep(2)


if __name__ == '__main__':
    main()
pcdoc
User
Beiträge: 7
Registriert: Mittwoch 16. April 2014, 22:07

Hallo BlackJack,

Danke! Muss mir "With" wirklich mal genauer anschauen. In meinem Fall waren die 10 Durchläufe nur für testzwecke. Später wird das mit True auf Dauerschleife laufen. Geht das mit einer "for"Schleifen auch?

mfg
Andreas
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

pcdoc hat geschrieben: Später wird das mit True auf Dauerschleife laufen. Geht das mit einer "for"Schleifen auch?
Dazu kannst Du doch eine simple ``while``-Schleife nutzen:

Code: Alles auswählen

while True:
    # do something
Alternativ kannst Du auch mittels ``itertools.cycle`` eine Endlosschleife bauen:

Code: Alles auswählen

from itertools import cycle

for value in cycle((0, 1)):
    # do something
Ich frage mich allerdings die ganze Zeit schon: Wieso steuerst Du die GPIOs nicht direkt aus Python aus an? Ständig etwas in eine Datei zu schreiben ist ein wenig... naja, "oldschool" :mrgreen:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
pcdoc
User
Beiträge: 7
Registriert: Mittwoch 16. April 2014, 22:07

Hyperion hat geschrieben: Dazu kannst Du doch eine simple ``while``-Schleife nutzen:
Das ist mir schon klar und so mache ich es ja auch aktuell. Jedoch hat Blackjack die for-Schleife vorgeschalgen, mit der ich mich zugegebener Weise bis jetzt nur sehr oberflächlich beschäftigt habe. Deshlab die Frage ob das auch mit der for-Schleife möglich ist.
Hyperion hat geschrieben: Alternativ kannst Du auch mittels ``itertools.cycle`` eine Endlosschleife bauen:
Ich seh schon da gibts noch ne Menge zu lernen! Bis jetzt beschränke ich mich eher auf die einfachen Wege, die normal auch zum Ziel führen. Aber auch das werde ich mir mal genauer anschauen. Worin liegt denn der Vorteil es so zu machen?

Hyperion hat geschrieben: Ich frage mich allerdings die ganze Zeit schon: Wieso steuerst Du die GPIOs nicht direkt aus Python aus an? Ständig etwas in eine Datei zu schreiben ist ein wenig... naja, "oldschool" :mrgreen:
Wenn du mir sagst wie wäre ich dir sehr dankbar! ABER ich verwende keinen Raspberry Pi! Somit fällt wiringpi weg! Das board was ich verwende ist ein Radxa Rock und dafür hab ich noch keine Libary gefunden die ich verwenden könnte um die GPIOs direkt anzusteuern.

mfg
Andreas
BlackJack

@pcdoc: Die ``for``-Schleife hatte ich ja nur vorgeschlagen weil die im Fall das man die Schleife nicht endlos ausführen möchte, einfacher ist. Man spart sich zwei Zeilen Code und man kann innerhalb der Schleife zum Beispiel ``continue`` verwenden (auch wenn ich persönlich das nicht mag).

Der Vorteil bei `itertools.cycle()` liegt in einer gesparten Schleife:

Code: Alles auswählen

    while True:
        for value in [False, True]:
            with open(r'd:\test.txt', 'w') as out_file:
                out_file.write(str(int(value)))
            sleep(2)
    # 
    # vs.
    # 
    for value in itertools.cycle([False, True]):
        with open(r'd:\test.txt', 'w') as out_file:
            out_file.write(str(int(value)))
        sleep(2)
Da ist jetzt die Frage wie man „einfache Wege” definiert — die zweite Variante hat einen Schritt/eine Verschachtelungsebene weniger. Ist das nun komplizierter oder einfacher? :-)

Auf jeden Fall sollte man vielleicht das schreiben in die Datei(en) hinter einer API verstecken und nicht tatsächlich zum schalten von GPIOs Dateizugriffe im Programm verteilen.
Antworten