Forum: PC-Programmierung Warum schreibt Python diese B ins Ergebnis?


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Pythonanfänger (Gast)


Lesenswert?

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

von Le X. (lex_91)


Lesenswert?

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.

von Pythonanfänger (Gast)


Lesenswert?

Thx

wie gesagt ich bin blutiger Anfänger und verstehe eigentlich nicht sehr 
viel das darin besprochen wird. Zuviele Fachausdrücke.

Gruss

von Blindschleiche (Gast)


Lesenswert?

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

von MaWin (Gast)


Lesenswert?

Das b ist nicht Teil der Daten.

von Sebastian W. (wangnick)


Lesenswert?

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.