Datei lesen und schreiben, Inhalt für If Anweisung verwenden

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.
wusa
User
Beiträge: 40
Registriert: Dienstag 18. Februar 2014, 11:08

Hallo,

ich schaffe es leider nicht, den Inhalt einer Datei für meine IF Anweisung zu verwenden.

Ich habe momentan eine Skript, das immer in einer Schleife läuft, das funktioniert soweit wunderbar. Jetzt möchte ich aber die Schleife raus haben und das ganze über einen Cronjob laufen lassen.

Mein momentanes Skript sieht wie folgt aus. Ich schicke nur den relevanten Teil um den es geht. Wenn jemand den ganzen Zusammenhang wissen will, kann ich gerne auch den ganze Code schicken.

Code: Alles auswählen

UPPER = 23
LOWER = 21
luefter_an = False

while True:
    netzwerkschranktemp = sensorauslesen()

    if luefter_an == True and netzwerkschranktemp < LOWER:
        luefter_an = False
        gpio.output(11, gpio.HIGH)

    if luefter_an == False and netzwerkschranktemp > UPPER:
        luefter_an = True
        gpio.output(11, gpio.LOW)

    time.sleep(899)
Ich frage meinen DS18B20 Sensor im Netzwerkschrank ab und schalte einen Lüfter in je nach Zustand und Temperatur an oder aus.
Das ganze funktioniert wie oben zu sehen wunderbar. Alle 15 Min läuft die Schleife.

Jetzt will ich das ganze aber auf einen Cronjob umbauen und dazu benötige ich eine Datei um den Zustand zu speichern.
Ich habe bisher folgendes probiert:

Code: Alles auswählen

file = open("netzwerkschrank.txt", "r")
luefter_an = (file.read())
file.close

if luefter == True and netzwerkschranktemp < LOWER:
    file = open("netzwerkschrank.txt", "w")
    file.write("False")
    file.close
    gpio.output(11, gpio.HIGH)

if luefter == 'aus' and netzwerkschranktemp > UPPER:
    file = open("netzwerkschrank.txt", "w")
    file.write("True")
    file.close
    gpio.output(11, gpio.LOW)
Ich habe auch mit True und False mit "" getestet. Also
if luefter == "True" and.....
Beides funktioniert leider nicht.
Lese ich die Datei aus, dann wird auch der Inhalt ausgelesen. Je nachdem ob ich beim ersten Start True oder False rein schreibe.

Auch habe ich das ganze nochmal anders getestet:
if luefter == 'an' and netzwerkschranktemp < LOWER:
file = open("netzwerkschrank.txt", "w")
file.write("aus")
file.close
gpio.output(11, gpio.HIGH)

if luefter == 'aus' and netzwerkschranktemp > UPPER:
file = open("netzwerkschrank.txt", "w")
file.write("an")
file.close
gpio.output(11, gpio.LOW)
Auch hier wir die Datei sauber ausgelesen entweder mit "an" oder mit "aus".

In allen Fällen, wird aber nichts in die Datei geschrieben.

Ich habe mir ein paar Print ausgaben dazu gebaut um zu sehen, ob überhaupt in die IF Abfrage gesprungen wird. Das ist leider nicht der Fall.
Ich vermute, dass hier mit dem Dateityp und der IF Abfrage irgendwas nicht stimmt.

Vielleicht kann mir jemand einen Tipp in die richtige Richtung geben.

Danke
Benutzeravatar
noisefloor
User
Beiträge: 4149
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

`close ` ist eine Methode des Dateiobjekt, d.h. du musst die Methode auch aufrufen: `file.close()` - bei dir fehlen die Klammern.

Und am besten direkt das `with` Statement nehmen, dann kümmert sich Python um's Schließen der Datei:

Code: Alles auswählen

>>> with open('foo.txt', 'w') as file:
...     file.write('true')
...
4
>>> with open('foo.txt', 'r') as file:
...     data = file.read()
...
>>> data
'true'
>>> data == 'true'
True
Gruß, noisefloor
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Der Vergleich mit True/False muss fehlschlagen, schließlich vergleichst du Äpfel-strings mit wahrheitswert-Birnen.

Wenn du mit einem String verglichen hast, dann ist der Inhalt eben nicht das gewesen, mit dem du verglichen hast. Leerzeichen oder Zeilenumbrüche zb können das komplizierter machen.
wusa
User
Beiträge: 40
Registriert: Dienstag 18. Februar 2014, 11:08

Ich komme leider wieder nicht in die IF Abfrage rein.

Code: Alles auswählen

if luefter_an == True and netzwerkschranktemp < LOWER:
    print("aus")
    with open("netzwerkschrank.txt", "w") as file:
        file.write("False")
    gpio.output(11, gpio.HIGH)
   
if luefter_an == False and netzwerkschranktemp > UPPER:
    print("an")
    with open("netzwerkschrank.txt", "w") as file:
        file.write("True")
    gpio.output(11, gpio.LOW)


Es wird mir kein Print zurückgegeben.
Ich habe es auch mit "True" und "False" in "" getestet. Bringt leider keine Änderung.

Am Anfang frage ich die Datei an mit:

Code: Alles auswählen

with open('netzwerkschrank.txt', 'r') as file:
    luefter_an = file.read()
print(luefter_an)
Rückgabewert ist:
True
True habe ich beim erstellen der Datei selbst rein geschrieben.
wusa
User
Beiträge: 40
Registriert: Dienstag 18. Februar 2014, 11:08

__deets__ hat geschrieben: Donnerstag 3. März 2022, 10:12 Der Vergleich mit True/False muss fehlschlagen, schließlich vergleichst du Äpfel-strings mit wahrheitswert-Birnen.

Wenn du mit einem String verglichen hast, dann ist der Inhalt eben nicht das gewesen, mit dem du verglichen hast. Leerzeichen oder Zeilenumbrüche zb können das komplizierter machen.
Wie kann ich sowas dann umsetzen? Ich habe auch schon versucht mit luefter == an oder luefter == aus. Dann müsste ich nicht mit wahrheitswerten arbeiten.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst eben die korrekten strings vergleichen. Was steht in der datei? Stimmt die groß/Kleinschreibung? Sind die Leerzeichen alle mit strip entfernt? Du kannst dir mit print(repr(Inhalt)) anschauen, was du da genau drin hast.
Sirius3
User
Beiträge: 18216
Registriert: Sonntag 21. Oktober 2012, 17:20

Man vergleicht nicht explizit mit True oder False, sondern nutzt `luefer_an` bzw `not luefter_an`. Man sollte keine magischen Zahlen benutzen, definiere Konstanten.

Code: Alles auswählen

LUEFTER_PIN = 11
UPPER = 23
LOWER = 21
luefter_an = False

while True:
    netzwerkschranktemp = sensorauslesen()

    if luefter_an:
        if netzwerkschranktemp < LOWER:
            luefter_an = False
            gpio.output(LUEFTER_PIN , gpio.HIGH)
    else:
        if netzwerkschranktemp > UPPER:
            luefter_an = True
            gpio.output(LUEFTER_PIN , gpio.LOW)

    time.sleep(899)
Du hast Text, also mußt Du mit einem String vergleichen. Benutze Konstanten für den Dateinamen

Code: Alles auswählen

SCHRANK_FILENAME = "netzwerkschrank.txt"
with open(SCHRANK_FILENAME):
    luefter_an = file.read().strip() == "True"
wusa
User
Beiträge: 40
Registriert: Dienstag 18. Februar 2014, 11:08

Code: Alles auswählen

print(repr(Inhalt))
Bringt folgende Ausgabe:

Code: Alles auswählen

'an'\n
Ich konnte es mit Strip entfernen, komme aber auch so nicht weiter.

Auch habe ich den Ansatz von @Sirius3 getestet:

Code: Alles auswählen

Netzwerkschrankfile = "netzwerkschrank.txt"
with open(Netzwerkschrankfile) as file:
    luefter_an = file.read().strip() == "True"
    print(repr(luefter_an))
    print(type(luefter_an))
Als Rückgabewert kommt

Code: Alles auswählen

True
<class 'bool'>

Code: Alles auswählen


if luefter_an == 'True' and netzwerkschranktemp < LOWER:
    print("aus")
    with open("netzwerkschrank.txt", "w") as file:
        file.write("False")
    gpio.output(11, gpio.HIGH)
 
if luefter_an == 'False' and netzwerkschranktemp > UPPER:
    print("an")
    with open("netzwerkschrank.txt", "w") as file:
        file.write("True")
Auch hier komme ich nicht in die IF Abfrage rein. Ich bekomme kein Print aus der IF Abfrage zurück. Auch hier wieder mit und ohne "" getestet.

Das es Nachholbedarf bei den Konstanten gibt, das ist mir bewusst. Das würde ich im Nachgang dann anpassen.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dir ist augenscheinlich nicht klar, dass strings in Dateien ohne "" gehören. Das ist notwendig in *Python*, weil da nunmal unterschieden werden muss zwischen einem Bezeichner und einem String literal. Aber die haben in deiner Datei nix zu suchen, und entsprechend schlägt der Vergleich auch fehl, wenn du nur auf "an" oder "aus" vergleichst, aber "''an'" oder "'aus'" da drin steht.
wusa
User
Beiträge: 40
Registriert: Dienstag 18. Februar 2014, 11:08

In meiner Datei steht nur
an
ohne ""

Die "" werden nur angezeigt, wenn ich mit der repr Funktion mir den Inhalt anzeigen lasse
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dann stimmt das was du da oben gepostet hast nicht. Denn da steht klar ein \n *nach* einem Anführungszeichen! Wenn du hier falsche Informationen postest, weil du irgendwas irgendwie aus dem Gedächtnis hinschluderst, dann wird’s nix.
wusa
User
Beiträge: 40
Registriert: Dienstag 18. Februar 2014, 11:08

Sorry. Das war echt keine Absicht. Ich probiere momentan einfach, wie es funktionieren könnte und hab die Zeile nicht kopiert, sondern abgeschrieben.

Jetzt extra nochmal getestet. Sieht wie folgt aus:

Code: Alles auswählen

'an\n'
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dann geht das hier:

Code: Alles auswählen

inhalt = 'an\n'
print(inhalt.strip() == "an")
Benutzeravatar
pillmuncher
User
Beiträge: 1527
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@wusa: Und wass sollte deiner Meinung nach herauskommen, wenn du 'an\n' und 'True' vergleichst? Oder 'an' und 'True'? Oder 'an' und 'False'?
In specifications, Murphy's Law supersedes Ohm's.
wusa
User
Beiträge: 40
Registriert: Dienstag 18. Februar 2014, 11:08

@pillmuncher

Ich will ja nicht "an" und "True" vergleichen. Das waren mehrere Lösungsansätze.

Bisher komme ich aber noch nicht zu einer Lösung
Sirius3
User
Beiträge: 18216
Registriert: Sonntag 21. Oktober 2012, 17:20

Wie sieht denn Dein jetziger Code aus?
wusa
User
Beiträge: 40
Registriert: Dienstag 18. Februar 2014, 11:08

Sorry für die späte Rückmeldung.
In der Datei Netzwerkschrankfile steht folgendes: Ohne irgendwelche sonstige Zeichen.

Code: Alles auswählen

Netzwerkschrankfile = "netzwerkschrank.txt"
with open(Netzwerkschrankfile) as file:
        luefter = file.read().strip()

print(repr(luefter))
print(type(luefter))
Ausgabe:

Code: Alles auswählen

'an'
<class 'str'>

Code: Alles auswählen

if luefter_an == 'an' and netzwerkschranktemp < LOWER:
    print("aus")
    with open("netzwerkschrank.txt", "w") as file:
        file.write("aus")
    
if luefter_an == 'an' and netzwerkschranktemp > UPPER:
    print("an")
    with open("netzwerkschrank.txt", "w") as file:
        file.write("an")
Ich habe gestern noch ein wenig probiert. Aber bisher noch keine Lösung gefunden.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Da steht einmal luefter. Und einmal luefter_an. Und warum steht der Code zur Ausgabe nicht an oder kurz vor der Stelle, wo du das prüfst? Und welchen Inhalt hat die Temperatur?
wusa
User
Beiträge: 40
Registriert: Dienstag 18. Februar 2014, 11:08

Ich habe gestern noch zu viel probiert und dann irgendwann abgebrochen. Das passe ich natürlich an. Das sollte so nicht sein.

Inhalt der Temperatur ist der Wert, der aus dem DS18B20 kommt.

Code: Alles auswählen

def sensorauslesen():
    try:
            sensor = open(netzwerkschrank)
            sensordata = sensor.read()
            sensor.close()
            tempdata = sensordata.split("\n")[1].split(" ")[9]
            temp_netzwerkschrank = float(tempdata[2:])
            temp_netzwerkschrank = temp_netzwerkschrank / 1000
            return temp_netzwerkschrank

Code: Alles auswählen

Netzwerkschrankfile = "netzwerkschrank.txt"
with open(Netzwerkschrankfile) as file:
        luefter = file.read().strip()

if luefter == 'an' and netzwerkschranktemp < LOWER:
    print("aus")
    with open("netzwerkschrank.txt", "w") as file:
        file.write("aus")
    gpio.output(11, gpio.HIGH)
  
if luefter == 'aus' and netzwerkschranktemp > UPPER:
    print("an")
    with open("netzwerkschrank.txt", "w") as file:
        file.write("an")
    gpio.output(11, gpio.LOW)

__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und in den Code gehört vor dem if das Print mit repr für beide Werte. Lüfter und Temperatur. Nur dann kannst du sehen, was da mit den Bedingungen passiert.
Antworten