Seite 1 von 1

neue Zeile

Verfasst: Freitag 19. Juli 2013, 20:30
von Anton_s
Hallo,

bin ganz neu hier, und kann einfach nicht hinter diese Kleinigkeit.
Mit folgenden Code schreibe ich ein paar werte in eine Datei.

Code: Alles auswählen

f = open("/var/www/ausgabe.html", "w")
#f.seek (10)
f.write(str(bad))
#f.seek (10)
f.write(str(buero))
#f.seek (20)
f.write(str(gang))
f.close ()
Leider werden mit die ausgegebenen Werte ohne neue Zeile geschrieben. Was muss ich machen, damit ich nach jeden eintrag ne neue Zeile habe ?

MfG

Re: neue Zeile

Verfasst: Freitag 19. Juli 2013, 21:01
von cofi
Willkommen im Forum!

Nun, wenn du nach jedem `write` eine neue Zeile haben willst, musst du newlines schreiben.
Daneben solltest du `with` zum Umgang mit Dateien nehmen:

Code: Alles auswählen

with open('/var/www/ausgabe.html', 'w') as f:
    for line in bad, buero, gang:
        f.write('%s\n' % line)

Re: neue Zeile

Verfasst: Freitag 19. Juli 2013, 21:51
von Anton_s
Hallo, klappt leider immer noch nicht. Hier mal das ganze:

Code: Alles auswählen

#!/usr/bin/env python 
tfile = open("/sys/bus/w1/devices/w1_bus_master1/28-000003bad286/w1_slave") 
text1 = tfile.read() 
tfile.close() 
tempdata1 = text1.split()[-1] 
temp1 = float(tempdata1[2:]) 
temp1 = temp1 / 1000 

tfile2 = open("/sys/bus/w1/devices/w1_bus_master1/28-000003bad0b2/w1_slave") 
text2 = tfile2.read() 
tfile2.close() 
tempdata2 = text2.split()[-1] 
temp2 = float(tempdata2[2:]) 
temp2 = temp2 / 1000 

tfile3 = open("/sys/bus/w1/devices/w1_bus_master1/28-000003bac591/w1_slave") 
text3 = tfile3.read() 
tfile3.close() 
tempdata3 = text3.split()[-1] 
temp3 = float(tempdata3[2:]) 
temp3 = temp3 / 1000 

print 'Bad', temp1 
print 'Buero',temp2 
print 'Aussen',temp3 
bad = temp1 
buero = temp2 
gang = temp3 

f = open("/var/www/ausgabe.html", "w") 
#f.seek (10) 
f.write(str(bad)) 
f.seek (10) 
f.write(str(buero)) 
f.seek (20) 
f.write(str(gang)) 
f.close () 

Re: neue Zeile

Verfasst: Freitag 19. Juli 2013, 22:11
von BlackJack
@Anton_s: Ich sehe das nicht wo Du den Vorschlag von cofi verwendet hättest. Das ist ja noch mal das gleiche wie vorher. Das sich am Ergebnis nichts ändert wenn Du am Code nichts veränderst, sollte eigentlich klar sein.

Die ganze Wiederholungen im Quelltext und die durchnummerierten Namen sind unschön. Dafür gibt es Schleifen, Funktionen, und Datenstrukturen wie beispielsweise Listen, um so etwas zu umgehen.

Re: neue Zeile

Verfasst: Freitag 19. Juli 2013, 22:15
von Sirius3
@Anton_s: Klappt immer noch nicht ist keine sinnvolle Fehlerbeschreibung. Die Zeilen von cofi lösen Dein anfangs beschriebenes Problem perfekt, ich sehe aber nicht, wie Du sie in Deinem Code eingebaut hast. Da stellt sich mir die Frage: hast Du die Lösung überhaupt ausprobiert. Und falls ja, wie genau?

Re: neue Zeile

Verfasst: Freitag 19. Juli 2013, 22:27
von Anton_s
Hallo,

ja habe es probiert, aber bei mir steht noch immer alles in einer Zeile.
Oder was wollt ihr wissen ?

MfG

Re: neue Zeile

Verfasst: Freitag 19. Juli 2013, 22:42
von BlackJack
@Anton_s: Wir wollen wissen *was* Du *genau* gemacht hast. Bei cofi's Code entstehen in der Textdatei mehrere Zeilen. Was natürlich jetzt noch sein könnte, ist das der Browser das ignoriert, weil Browser das bei HTML halt so machen.

Weder Dein Code noch der von cofi erzeugen allerdings HTML. Zudem sind bei Deinem die `seek()`-Aufrufe unsinnig und falsch. Das dürfte mit Nullbytes zwischen den Zeichenketten enden, die in einer HTML-Datei bzw. Textdateien im allgemeinen bei den meisten Textkodierungen, nichts zu suchen haben.

Setz Dich am besten mal mit einem Grundlagentutorial für Python auseinander wo gezeigt wird wie man mit Zeichenketten umgeht. Insbesondere wie man Werte in eine Zeichenkette formatiert. Und dann schreib ein kleines HTML-Grundgerüst mit Platzhaltern für die drei Werte und formatiere die dort hinein, damit Du eine gültige HTML-Datei bekommst. Wo die entsprechenden Tags drin stehen um das vom Browser formatieren zu lassen, wie Du es angezeigt haben möchtest. Also zum Beispiel <p>-Tags um Absätze zu erstellen.

Re: neue Zeile

Verfasst: Samstag 20. Juli 2013, 09:07
von /me
BlackJack hat geschrieben:Die ganze Wiederholungen im Quelltext und die durchnummerierten Namen sind unschön. Dafür gibt es Schleifen, Funktionen, und Datenstrukturen wie beispielsweise Listen, um so etwas zu umgehen.
Das könnte dann beispielsweise so aussehen (ungetestet):

Code: Alles auswählen

filelist = ["/sys/bus/w1/devices/w1_bus_master1/28-000003bad286/w1_slave",
            "/sys/bus/w1/devices/w1_bus_master1/28-000003bad0b2/w1_slave",
            "/sys/bus/w1/devices/w1_bus_master1/28-000003bac591/w1_slave"]

temperatures = []
for file_ in filelist:
    with open(file_) as tfile:
        data = tfile.read().split()[-1]
        temperatures.append(float(data[2:]) / 1000)

Re: neue Zeile

Verfasst: Samstag 20. Juli 2013, 09:31
von Sirius3
oder so:

Code: Alles auswählen

#!/usr/bin/env python 
PATH_TO_SENSOR = "/sys/bus/w1/devices/w1_bus_master1/%s/w1_slave"
SENSORS = {
    'bad': '28-000003bad286',
    'buero': '28-000003bad0b2',
    'gang': '28-000003bac591',
}

def read_sensor(sensor):
    with open(PATH_TO_SENSOR%sensor) as tfile:
        return 0.001 * float(tfile.read().split()[-1][2:])

def write_temperatures_as_html(filename, temperatures):
    with open(filename,'w') as output:
        rows = '\n'.join(map('<tr><td>{0}</td><td>{1:.1f}</td>'.format, temperatures.items()))
        output.write("""<html><body>
<table><tr><th>Ort</th><th>Temperator</th></tr>
%s
</table>
</body></html>"""%rows)

def main():
    temperatures = dict( (ort, read_sensor(sensor))
        for ort, sensor in SENSORS.items() )
    write_temperatures_as_html("/var/www/ausgabe.html", temperatures)
    
if __name__ == '__main__':
    main()

Re: neue Zeile

Verfasst: Samstag 20. Juli 2013, 14:04
von Anton_s
Hallo, danke für die zahlreichen Antworten. Das meiste ist mir leider zu hoch :-(

Hab es jetzt mit meinen eigenen mitteln hinbekommen.
Ist wahrscheinlich primitiv aber es funktioniert.

Code: Alles auswählen

import time
#!/usr/bin/env python

tfile = open("/sys/bus/w1/devices/w1_bus_master1/28-000004e55fbb/w1_slave")
text1 = tfile.read()
tfile.close()
tempdata1 = text1.split()[-1]
temp1 = float(tempdata1[2:])
temp1 = temp1 / 1000

tfile2 = open("/sys/bus/w1/devices/w1_bus_master1/28-000004e3deda/w1_slave")
text2 = tfile2.read()
tfile2.close()
tempdata2 = text2.split()[-1]
temp2 = float(tempdata2[2:])
temp2 = temp2 / 1000

tfile3 = open("/sys/bus/w1/devices/w1_bus_master1/10-0008024da8d4/w1_slave")
text3 = tfile3.read()
tfile3.close()
tempdata3 = text3.split()[-1]
temp3 = float(tempdata3[2:])
temp3 = temp3 / 1000

bad = temp1
buero = temp2
gang = temp3

now = time.strftime("%d.%m.%Y um %H:%M:%S Uhr")
print 'letzte aktualisierung:', now
print 'Sensor 1 klein',temp1
print 'Sensor 2 klein',temp2
print 'Sensor 3 abges',temp3

#with open('/var/www/ausgabe.html', 'w') as f:
#    for line in bad, buero, gang:
#        f.write('%s \n <br >' % line)
#f.close ()

f = open("/var/www/ausgabe.html", "w")
f.write ("Letzte Aktualisierung: ")
f.write (str(now))
f.write ("<br>")
f.write ("<br>")
f.write ("Sensor 1: ")
f.write (str(bad))
f.write ("<br>")
f.write ("Sensor 2: ")
f.write (str(buero))
f.write ("<br>")
f.write ("Sensor 3: ")
f.write (str(gang))
f.close ()
Ich würde noch gerne eine schleife einbauen, damit das ganze alle 20 sek sich wiederholt. Hat da noch jemand einen Tipp für mich ?

MfG Anton

Re: neue Zeile

Verfasst: Samstag 20. Juli 2013, 14:09
von snafu
Anton_s hat geschrieben:Ich würde noch gerne eine schleife einbauen, damit das ganze alle 20 sek sich wiederholt. Hat da noch jemand einen Tipp für mich ?
Kopiere doch einfach den kompletten Quelltext so oft, wie du ihn brauchst, untereinander. Zwischen jeder Kopie setzt du ein `time.sleep(20)`.

Ist wahrscheinlich primitiv aber es funktioniert. :)

Re: neue Zeile

Verfasst: Samstag 20. Juli 2013, 14:10
von BlackJack
@Anton_s: Lern Python, damit so einfache Sachen wie Schleifen nicht mehr zu hoch für Dich sind. ;-)

Re: neue Zeile

Verfasst: Samstag 20. Juli 2013, 14:15
von jerch
@Anton_s:
1. Öffne die Datei mit Deinem Editor
2. Füge eine Zeile in Zeile 4 hinzu:`while True:`
3. Füge darunter eine Zeile hinzu: `time.sleep(20)`
4. Rücke alles unterhalb `while True` um 4 Leerstellen ein.

Obwohl mir @snafus Variante deutlich besser gefällt. :twisted:

Re: neue Zeile

Verfasst: Samstag 20. Juli 2013, 14:47
von /me
snafu hat geschrieben:Kopiere doch einfach den kompletten Quelltext so oft, wie du ihn brauchst, untereinander. Zwischen jeder Kopie setzt du ein `time.sleep(20)`.
:lol: Wo ist die "Like"-Funktion?