Hallo Leute Ich bin blutiger Python Anfänger. Mit einem ESP32 schicke ich einen Text über USB an den Raspberry Pi 3. Code ESP32: dblOut = float(sensorValue); dblOut = dblOut * 3.3; dblOut = dblOut / 4096.0; strOut = String(dblOut,3); strOut = "Volt: " + strOut + "\r\n"; Serial.print(strOut); Mit dem Arduino Sketch und Serieller Monitor erhalte ich z.B. : Volt: 1.892 Genau dies will ich Mit Python auf dem Raspi möchte ich das gleiche wie oben über USB empfangen. Python Code: ser_text = ser.read_until(b'\r\n') print(ser_text.strip()) Ich bekommen aber: b'Volt: 1.892' Ich möchte diese 'b' nicht im Ergebnis Was mache ich falsch? B steht doch für Byte aber B möchte ich nicht im Resultat. Muss ich dies manuell rauslöschen oder gibt es da eine elegantere Lösung? Gruss und Dank
Das schöne an Python ist, man muss keine langen Forenposts schreiben wenn man etwas wissen möchte. Man kann einfach die Frage in google eingeben und den ersten Treffer von StackOverflow nehmen. Schon hat man seine Antwort + ausführliche Erklärung. Beispiel: https://stackoverflow.com/questions/6269765/what-does-the-b-character-do-in-front-of-a-string-literal Lösung für dein Problem ist die .decode-Methode, siehe Link.
Thx wie gesagt ich bin blutiger Anfänger und verstehe eigentlich nicht sehr viel das darin besprochen wird. Zuviele Fachausdrücke. Gruss
Kurzantwort: das b'xxxxxx' bedeutet, dass es sich um irgendwas "Byte"-artiges ist (class 'bytes'). Python kann ja nicht wissen, ob es eine Zahl, String oder ein Byte-Wert sein soll. direkt in der Konsole:
1 | a = b'1234' |
2 | type(a) |
3 | <class 'bytes'> |
4 | b=a.decode() |
5 | type(b) |
6 | <class 'str'> |
7 | print(b) |
8 | 1234 |
9 | c=int(b) |
10 | type(c) |
11 | <class 'int'> |
12 | d=float(b) |
13 | <class 'float'> |
Was allerdings auch geht (wenn Du sicher bist, dass es sich immer um eine Zahl handelt)
1 | a=b'1.23E+2' |
2 | float(a) |
3 | 123.0 |
Pythonanfänger schrieb: > wie gesagt ich bin blutiger Anfänger und verstehe eigentlich nicht sehr > viel das darin besprochen wird. Zuviele Fachausdrücke. Willkommen in der wunderbaren Welt von Unicode. Was du hier beobachtest ist die Spitze eines Eisbergs. Darunter verbirgt sich folgendes: Python unterscheidet, seit Version 3 sogar ziemlich strikt, zwischen Zeichen und Bytes. Zeichen sind abstrakte Gebilde, vereinfacht gesagt Unicode-Codepunkte (also zum Beispiel das Zeichen ü oder 字). Bytes sind vereinfacht gesagt Zahlenwerte zwischen 0 und 255. Wann immer Zeichen eingelesen oder ausgegeben werden müssen sie aus Zahlenwerten in Zeichen dekodiert (beim Einlesen) oder (beim Ausgeben) wieder in Zahlenwerte zurück enkodiert werden. Die serielle Schnittstelle liefert also keine Zeichen (zum Beispiel ü oder 字) sondern Bytes (also Zahlen zwischen 0 und 255). Nun deine eigentliche Frage nach dem "b". Zur Darstellung müssen Bytes in Zeichen verwandelt werden. Dazu benutzt Python per default eine kompakte Dekodiermethode, die die Bytes so darstellt wie sie auch von Python als Literal [1] akzeptiert würde, also mit einem "b" am Anfang, dann einem einfachen oder doppelten Apostroph, dann den Bytewerten entweder als ASCII-Zeichen oder "escaped", und dann einem schliessenden Apostroph. Wenn du diese Darstellung nicht magst, dann musst du die Bytes selber in Zeichen umwandeln, und dabei eine Darstellung (ein encoding [2]) auswählen, z.B. mit
1 | print(ser_text.strip().decode('latin-1')) |
LG, Sebastian [1] http://docs.python.org/3/reference/lexical_analysis.html#grammar-token-bytesliteral [2] [http://docs.python.org/3/library/codecs.html?highlight=standard%20encodings PS: Der serielle Monitor der Arduino-IDE muss natürlich auch Zahlenwerte in Zeichen (und eingegebene Zeichen in Zahlenwerte) umwandeln. Er benutzt dazu anscheinend das Standard-Encoding der Plattform, ist also viel weniger flexibel als Python.
:
Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.