Hallo,
ich will nur Punkte gegen Kommas ersetzen. Aber es klappt nicht.
Es geht um dieses Script https://github.com/jrleeman/PiRainSenso ... /bme280.py welches einen Sensor ausließt. Ich habe die Print Ausgabezeile angepasst
oben ein Import Datetime
und unten
print '{:%d.%m.%Y;%H:%M:%S}'.format(datetime.datetime.now()),";%.1f"%temperature,";%.1f"%humidity,";%.2f"%pressure
Das ergibt dann ein
03.12.2016;15:38:06 ;1.8 ;69.3 ;931.63
Mit einem Cronjob und Bashscript (welches die leerzeichen dazwischen entfernt) werden mit diesen Daten eine CSV Datei gefüttert. Heute wollte ich mit LibreOffice diese Daten Visualisieren aber da gibt es Probleme mit . und ,
Daher wollte ich bei dem python Programm die Ausgabe ändern lassen in
03.12.2016;15:38:06 ;1,8 ;69,3 ;931,63
Leider gelingt es mir nicht
temperature2 = float(temperature.replace(".",","))
print temperature2
wird
AttributeError: 'float' object has no attribute 'replace'
temperature2 = temperature(line.replace('.', ',')
print temperature2
wird
SyntaxError: invalid syntax
print temperature.replace(".", ",")
wird
AttributeError: 'float' object has no attribute 'replace'
Ich finde auch nichts brauchbares mit Google z.B. mit python punkt in komma umwandeln oder python variable punkt zu komma. Wer hat einen schnellen Tipp?
Punkt werde zu Komma
@cobra2000: Der schnelle Tipp wäre den Syntaxfehler zu beseitigen, der ziemlich offensichtlich ist. Falls Du ihn nicht siehst, dann lösch die Zeile und tippe sie neu ein. Nicht kopieren, wirklich tippen. Den Fehler machst Du dann hoffentlich nicht ein zweites mal.
Und für die Zukunft: Nicht wild rumprobieren, sondern nachdenken, lesen und verstehen was einem die Fehlermeldungen sagen wollen. Den dritten Versuch hättest Du nach dem ersten gar nicht machen dürfen wenn Du verstanden hättest warum der erste nicht funktioniert.
Und für die Zukunft: Nicht wild rumprobieren, sondern nachdenken, lesen und verstehen was einem die Fehlermeldungen sagen wollen. Den dritten Versuch hättest Du nach dem ersten gar nicht machen dürfen wenn Du verstanden hättest warum der erste nicht funktioniert.
temperature2 = temperature(line.replace('.', ',')
print temperature2
wird
SyntaxError: invalid syntax
da fehlt am ende die Klammer. Aber auch damit wird es nichts, genau so wenig wenn ich die Franzosenoberstriche gegen Gänsefüßchen ersetze. Irgendwo hab ich gelesen das man auch den Code an Landessprache definieren kann z.B. de und dann es evt. richtig ausgibt aber da mag er auch nicht.
Die Fehlermeldungen sagen mir nicht so viel. Irgendwas hieß es auf irgendwelchen anderen Internetseiten das float Variablen irgendwie geschützt seien und man da in andere Variable rübernehmen muss.
Ein test = temperatur + 9,8 (Temperatur hat derzeit den Wert 1.46)
ergibt
Da wandelt er leider auch nicht in komma um.
Es hat keinen Wert... ich habe das Datum und Uhrzeit aus dem Pythonscript raus geworfen und in der Linux Bash mit SED alle . gegen , ersetzen lassen und davor noch Datum und Uhrzeit hinkleben und gut ist.
print temperature2
wird
SyntaxError: invalid syntax
da fehlt am ende die Klammer. Aber auch damit wird es nichts, genau so wenig wenn ich die Franzosenoberstriche gegen Gänsefüßchen ersetze. Irgendwo hab ich gelesen das man auch den Code an Landessprache definieren kann z.B. de und dann es evt. richtig ausgibt aber da mag er auch nicht.
Die Fehlermeldungen sagen mir nicht so viel. Irgendwas hieß es auf irgendwelchen anderen Internetseiten das float Variablen irgendwie geschützt seien und man da in andere Variable rübernehmen muss.
Ein test = temperatur + 9,8 (Temperatur hat derzeit den Wert 1.46)
ergibt
Code: Alles auswählen
(10.46, 8)
Es hat keinen Wert... ich habe das Datum und Uhrzeit aus dem Pythonscript raus geworfen und in der Linux Bash mit SED alle . gegen , ersetzen lassen und davor noch Datum und Uhrzeit hinkleben und gut ist.
Für alle die über Goolge hier her gefunden haben wegen dem selben Problem hier noch meine Linux Bash Lösung zu dem Problem wie ich es umschifft habe.
es macht aus
und schreibt den Wert ergänzend in die Datei sensor.csv im Verzeichnis run
Code: Alles auswählen
#!/bin/sh
today=`/bin/date '+%d.%m.%Y;%H:%M'`;
pyth=`python /home/pi/sensor/zeilen/test.py | tr -d " " | sed 's/\./,/g'` >/dev/null 2>&1
echo $today$pyth >> /run/sensor.csv
es macht aus
Code: Alles auswählen
;1.3 ;69.2 ;932.46
03.12.2016;18:00;1,3;69,2;932,46
Du musst zuerst in String umwandeln, und dann Punkt durch Komma ersetzen:
Code: Alles auswählen
#python3
import datetime
temperature = 1.23
humidity = 4.56
pressure = 7.89
print('{:%d.%m.%Y;%H:%M:%S}'.format(datetime.datetime.now()) +
';{:.1f};{:.1f};{:.2f}'.format(temperature,humidity,pressure).replace('.',','))
@cobra2000: wenn Du lieber Bash programmieren willst, warum nimmst Du dann überhaupt Python?
für alle anderen: die Welt der verschiedenen Sprachen wird über sogenannte Locale gesteuert. Diese werden systemweit passend gesetzt und können aber auch für Zeiten, Geld und Zahlen unterschiedlich sein. Will man für sein Programm eine bestimmte Schreibweise einstellen, geht das auch über
strftime beachtet diese Einstellungen automatisch. Bei Zahlen gibt es ein extra locale.format_string:
So bekommt jeder die Ausgabe, die für ihn richtig erscheint:
@cobra2000: das Leerzeichen kommt daher, dass print die einzelnen Parameter mit einem Leerzeichen trennt. Das verhindert man eigentlich dadurch, dass man nur einen String ausgibt. Alternativ nimmt man gleich das csv-Modul, das für diese Art von formatierten Daten gemacht ist.
für alle anderen: die Welt der verschiedenen Sprachen wird über sogenannte Locale gesteuert. Diese werden systemweit passend gesetzt und können aber auch für Zeiten, Geld und Zahlen unterschiedlich sein. Will man für sein Programm eine bestimmte Schreibweise einstellen, geht das auch über
Code: Alles auswählen
import locale
locale.setlocale(locale.LC_ALL, 'de_DE')
Code: Alles auswählen
print locale.format_string('%s;%.1f;%.1f;%.2f', (datetime.datetime.now().strftime('%x;%X'), temperature, humidity, pressure))
# 03.12.2016;15:38:06;1,8;69,3;931,63
Code: Alles auswählen
locale.setlocale(locale.LC_ALL, 'en_US')
print locale.format_string('%s;%.1f;%.1f;%.2f', (datetime.datetime.now().strftime('%x;%X'), temperature, humidity, pressure))
# 12/03/2016;15:38:06;1.8;69.3;931.63
Sirius3 hat geschrieben:@cobra2000: wenn Du lieber Bash programmieren willst, warum nimmst Du dann überhaupt Python?
Wer eine Bohrmaschine kauft will keine Bohrmaschine kaufen sondern Löcher. Und so ist es auch mit Python. Ich habe einen BME280 i²C Sensor dessen Werte ich vorerst in einer csv haben möchte. Da ich unfähig bin selbst irgendetwas zu entwickeln welches diesen Sensor ausließt muss ich eben nach dem Baukastenprinzip diverse Fertiglösungen zusammen suchen und falls möglich hier und da kleinere Anpassungen vornehmen die ich meist im Versuch+Irrtum Prinzip aus unzähligen anderen Internetbeiträgen entnehme. Mit meiner Bash Murx-Lösung bin ich letztlich auch ans gewünschte Ziel gekommen, aber es ärgert einem schon wenn man weiß das es auch direkt im python code geht aber man nach 3 Stunden nicht weiter kommt. Von Bash hab ich eigentlich auch wenig Ahnung nur waren da Beispielscripte schneller gefunden die auch auf Anhieb funktionierten. Ich selbst hätte vermutlich den SED Parameter auch nicht hin bekommen.
Wenn ich programmieren könnte, wäre der Beste weg diese Sensorabfrage und schreiben in die Datei direkt in eine "ich sag es mal wie in der Windows welt" eine exe machen die es hochoptimiert ausführt ohne extra Programme im Hintergrund.
Ich habe drei python Scripte zum auslesen des BME280 im Internet gefunden und von denen ging nur eines sonst hätte ich keine alternativen Weg mehr gekannt die Daten auszulesen. Darum Python... hätte genau so auch GW-Basic oder Visual-Basic oder der gleichen sein können wenn es das für Linux Debian gäbe.
Man kann mit Python tolle Sachen machen und wie ich gesehen habe laufen viele der Bastelprojekte mit Python so das ich nach meinen mehr oder weniger erfolgreichen Pfusch-Aktionen mich für neue Projekt-Ideen vermutlich keine fertiglösungen finden werde und selbst Hand anlegen und die Python-Sprache erlernen sollte, um das dann auch machen zu können.
-----------------
Code: Alles auswählen
#print '{:%d.%m.%Y;%H:%M:%S}'.format(datetime.datetime.now()),";%.1f"%temperature,";%.1f"%humidity,";%.2f"%pressure
s_temperature = ("%.1f" % temperature).replace(".",",")
s_humidity = ("%.1f" % humidity).replace(".",",")
s_pressure = ("%.2f" % pressure).replace(".",",")
print '{:%d.%m.%Y;%H:%M:%S}'.format(datetime.datetime.now()),";",(s_temperature),(s_humidity),(s_pressure)
Code: Alles auswählen
03.12.2016;18:24:53 ;1.2 ;69.2 ;932.47
wird zu
03.12.2016;18:24:53 ; 1,2 69,2 932,47
Gewusst wie Mit etwas Glück und Fleiß kann ich vielleicht in paar Monaten über meine umständlichen Lösungswege lachen@cobra2000: das Leerzeichen kommt daher, dass print die einzelnen Parameter mit einem Leerzeichen trennt. Das verhindert man eigentlich dadurch, dass man nur einen String ausgibt. Alternativ nimmt man gleich das csv-Modul, das für diese Art von formatierten Daten gemacht ist.
Ich hab den eleganten Tipp noch ausprobiert. Der hat auf meinem Computer nicht funktioniert.
Traceback (most recent call last):
File "./bmeplus.py", line 29, in <module>
locale.setlocale(locale.LC_ALL, 'de_DE')
File "/usr/lib/python2.7/locale.py", line 547, in setlocale
return _setlocale(category, locale)
locale.Error: unsupported locale setting
Die Genie-Prothese Google half da
locale.setlocale(locale.LC_ALL, 'de_DE.utf8')
und schon geht es... echt super
03.12.2016;19:07:59;1,2;69,2;932,78 (drausen ist es kalt)
Code: Alles auswählen
import locale
locale.setlocale(locale.LC_ALL, 'de_DE')
print locale.format_string('%s;%.1f;%.1f;%.2f', (datetime.datetime.now().strftime('%x;%X'), temperature, humidity, pressure))
Traceback (most recent call last):
File "./bmeplus.py", line 29, in <module>
locale.setlocale(locale.LC_ALL, 'de_DE')
File "/usr/lib/python2.7/locale.py", line 547, in setlocale
return _setlocale(category, locale)
locale.Error: unsupported locale setting
Die Genie-Prothese Google half da
locale.setlocale(locale.LC_ALL, 'de_DE.utf8')
und schon geht es... echt super
03.12.2016;19:07:59;1,2;69,2;932,78 (drausen ist es kalt)
Ich hatte vor einigen Monaten das selbe Problem und mir eine Funktion zum Umwandeln (über Regular Expressions) geschrieben:
Code: Alles auswählen
from re import sub
def comma_float(num):
''' wandelt float in string mit echtem Komma um '''
return sub(r'\.', ',', str(num))
This is the end.
@Pywolf: Das ist ein bisschen mit Kanonen auf Spatzen geschossen `re` zum ersetzen einer statischen Zeichenkette durch eine andere statische Zeichenkette zu verwenden.