Punkt werde zu Komma

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
Benutzeravatar
cobra2000
User
Beiträge: 6
Registriert: Samstag 3. Dezember 2016, 15:30

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

@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.
Benutzeravatar
cobra2000
User
Beiträge: 6
Registriert: Samstag 3. Dezember 2016, 15:30

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

Code: Alles auswählen

(10.46, 8)
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.
Benutzeravatar
cobra2000
User
Beiträge: 6
Registriert: Samstag 3. Dezember 2016, 15:30

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.

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

und schreibt den Wert ergänzend in die Datei sensor.csv im Verzeichnis run
heiner88
User
Beiträge: 65
Registriert: Donnerstag 20. Oktober 2016, 07:29

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

@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

Code: Alles auswählen

import locale
locale.setlocale(locale.LC_ALL, 'de_DE')
strftime beachtet diese Einstellungen automatisch. Bei Zahlen gibt es ein extra locale.format_string:

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
So bekommt jeder die Ausgabe, die für ihn richtig erscheint:

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
@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.
Benutzeravatar
cobra2000
User
Beiträge: 6
Registriert: Samstag 3. Dezember 2016, 15:30

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
Danke für den Tipp. Hab es getestet und funktioniert. Wer das Script selbst auch so modifiziert haben will kann es da bequem kopieren, einfügen.

@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.
Gewusst wie :D Mit etwas Glück und Fleiß kann ich vielleicht in paar Monaten über meine umständlichen Lösungswege lachen :mrgreen:
Benutzeravatar
cobra2000
User
Beiträge: 6
Registriert: Samstag 3. Dezember 2016, 15:30

Ich hab den eleganten Tipp noch ausprobiert. Der hat auf meinem Computer nicht funktioniert.

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 :D

03.12.2016;19:07:59;1,2;69,2;932,78 (drausen ist es kalt)
Benutzeravatar
cobra2000
User
Beiträge: 6
Registriert: Samstag 3. Dezember 2016, 15:30

Echt super wenn man weiß was man ändern muss klappt es auch mit den zwei anderen python Scripten für die Sensoren bmp180 und htu21
Benutzeravatar
Pywolf
User
Beiträge: 5
Registriert: Dienstag 10. Mai 2016, 08:49

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

@Pywolf: Das ist ein bisschen mit Kanonen auf Spatzen geschossen `re` zum ersetzen einer statischen Zeichenkette durch eine andere statische Zeichenkette zu verwenden.
Antworten