neue Zeile

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
Anton_s
User
Beiträge: 4
Registriert: Freitag 19. Juli 2013, 20:24

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
Zuletzt geändert von cofi am Freitag 19. Juli 2013, 20:57, insgesamt 1-mal geändert.
Grund: Syntax-Highlighting gesetzt
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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)
Anton_s
User
Beiträge: 4
Registriert: Freitag 19. Juli 2013, 20:24

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 () 
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.
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@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?
Anton_s
User
Beiträge: 4
Registriert: Freitag 19. Juli 2013, 20:24

Hallo,

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

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

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)
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

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()
Anton_s
User
Beiträge: 4
Registriert: Freitag 19. Juli 2013, 20:24

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
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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. :)
BlackJack

@Anton_s: Lern Python, damit so einfache Sachen wie Schleifen nicht mehr zu hoch für Dich sind. ;-)
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

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

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?
Antworten