Wie konvertiere ich eine Python 3-Byte-String-Variable in einen regulären String?

115

Ich habe in einem XML-E-Mail-Anhang mit gelesen

bytes_string=part.get_payload(decode=False)

Die Nutzdaten werden als Byte-Zeichenfolge eingegeben, wie mein Variablenname andeutet.

Ich versuche, den empfohlenen Python 3-Ansatz zu verwenden, um diese Zeichenfolge in eine verwendbare Zeichenfolge umzuwandeln, die ich bearbeiten kann.

Das Beispiel zeigt:

str(b'abc','utf-8')

Wie kann ich das bSchlüsselwortargument (Bytes) auf meine Variable anwenden bytes_stringund den empfohlenen Ansatz verwenden?

Die Art, wie ich es versucht habe, funktioniert nicht:

str(bbytes_string, 'utf-8')
DjangoTango
quelle

Antworten:

209

Sie hatten es fast richtig in der letzten Zeile. Sie wollen

str(bytes_string, 'utf-8')

weil der Typ von bytes_stringist bytesder gleiche wie der Typ von b'abc'.

Toby Speight
quelle
6
str(bytes_string, 'utf-8', 'ignore')Fehler können durch Übergabe des dritten Parameters ignoriert werden.
Shubhamoy
2
Das sieht so aus, als ob es ein Kommentar zu Pylangs Antwort sein sollte (die sich mit der Behandlung ungültiger Eingaben befasst). Wenn (Sie glauben das) nichts falsch ist bytes_string, warum sollten Sie Fehler ignorieren?
Toby Speight
3
Ich erhalte folgenden Fehler bei Ihrem Ansatz: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbf in position 0: invalid start bytefür die folgenden Bytes Zeichenfolge b'\xbf\x8cd\xba\x7f\xe0\xf0\xb8t\xfe.TaFJ\xad\x100\x07p\xa0\x1f90\xb7P\x8eP\x90\x06)0'@TobySpeight
alper
Nun, @alper, das ist keine gültige UTF-8-Zeichenfolge. Was haben Sie also erwartet?
Toby Speight
Vielen Dank für die Lösung
Ajay Kumar
49

Rufen Sie decode()eine bytesInstanz auf, um den zu codierenden Text abzurufen.

str = bytes.decode()
uname01
quelle
5
UnicodeDecodeError: 'utf-8' Codec kann Byte 0xf6 in Position 230 nicht dekodieren: ungültiges
Startbyte
3
@JuhaUntinen Ihre Kodierung ist wahrscheinlich nicht utf-8.
Tommy.carstensen
4
Wie filtere (überspringe) Nicht-UTF8-Zeichen aus dem Array?
Dr. Failov
9

AKTUALISIERT:

KEINE bund Zitate am Anfang und am Ende zu haben

Wie bytesman in Strings konvertiert , auch in seltsamen Situationen.

Da Ihr Code möglicherweise nicht erkennbare Zeichen für die 'utf-8'Codierung enthält, ist es besser, nur str ohne zusätzliche Parameter zu verwenden:

some_bad_bytes = b'\x02-\xdfI#)'
text = str( some_bad_bytes )[2:-1]

print(text)
Output: \x02-\xdfI

Wenn Sie 'utf-8'diesen spezifischen Bytes Parameter hinzufügen , sollte eine Fehlermeldung angezeigt werden.

Wie PYTHON 3 Standard sagt, textwäre in utf-8 jetzt ohne Bedenken.

Seyfi
quelle
Ergebnis ist "b '\\ x02 - \\ xdfI #)'", was wahrscheinlich nicht das ist, was er will
Glen Thompson
@GlenThompson ist nur ein Beispiel für unerwünschte Zustände, die auftreten können. Ich benutze diesen speziellen Text absichtlich. Wenn Sie meinen, Text hat ein bin zuerst, dann habe ich Antwort aktualisiert
Seyfi
Vielen Dank, ich suche nach einer Möglichkeit, das b '' eines Strings mit ansi-Zeichen zu entfernen, ohne die Zeichen zu codieren und zu verlieren. Ich bin neu in Python und weiß nicht, wann ich ein Array von Anfang an reduzieren kann Beginn der Verwendung von Indizes: O
Diego Fernando Murillo Valenci
@DiegoFernandoMurilloValenci, herzlich willkommen. Ich bin froh, dass ich helfen kann.
Seyfi
6

Wie filtere (überspringe) Nicht-UTF8-Zeichen aus dem Array?

Ignorieren Sie die Fehler, um diesen Kommentar in @ uname01s Beitrag und im OP zu adressieren:

Code

>>> b'\x80abc'.decode("utf-8", errors="ignore")
'abc'

Einzelheiten

In den Dokumenten finden Sie weitere Beispiele, die denselben errorsParameter verwenden:

>>> b'\x80abc'.decode("utf-8", "replace")
'\ufffdabc'
>>> b'\x80abc'.decode("utf-8", "backslashreplace")
'\\x80abc'
>>> b'\x80abc'.decode("utf-8", "strict")  
Traceback (most recent call last):
    ...
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0:
  invalid start byte

Das Fehlerargument gibt die Antwort an, wenn die Eingabezeichenfolge nicht gemäß den Regeln der Codierung konvertiert werden kann. Zulässige Werte für dieses Argument sind 'strict'( UnicodeDecodeErrorAusnahme auslösen), 'replace'(Verwendung U+FFFD, REPLACEMENT CHARACTER) oder 'ignore'(lassen Sie das Zeichen einfach aus dem Unicode-Ergebnis heraus).

Pylang
quelle