Wie konvertiere ich 'Binärzeichenfolge' in Python3 in eine normale Zeichenfolge?

257

Zum Beispiel habe ich eine Zeichenfolge wie diese (Rückgabewert von subprocess.check_output):

>>> b'a string'
b'a string'

Was auch immer ich damit gemacht habe, es wird immer mit dem nervigen b'vor der Zeichenfolge gedruckt :

>>> print(b'a string')
b'a string'
>>> print(str(b'a string'))
b'a string'

Hat jemand eine Idee, wie man es als normale Zeichenfolge verwendet oder in eine normale Zeichenfolge konvertiert?

Hanfei Sun.
quelle
Mögliches Duplikat von Bytes in eine Zeichenfolge konvertieren?
Georgy
@HanfeiSun Was Sie als " binäre Zeichenfolge " bezeichnen, ist ein Byte-Objekt (siehe Informationen zum Byte-Objekt in der Standardbibliothek )
lovedbyby.Jesus

Antworten:

357

Dekodiere es.

>>> b'a string'.decode('ascii')
'a string'

Um Bytes von der Zeichenfolge abzurufen, codieren Sie sie.

>>> 'a string'.encode('ascii')
b'a string'
falsetru
quelle
27
@lyomi, ich habe verwendet, asciiweil die angegebene Zeichenfolge mit ASCII-Buchstaben erstellt wurde. Sie müssen nicht codiert , angeben müssen , wenn die Codierung utf-8(Standard in Python 3.x nach str.encode, bytes.decodedoc-string)
falsetru
2
@lyomi Im Jahr 2016 (und es ist fast das Ende) verwenden die Leute immer noch ASCII. Es gibt viele, viele "Legacy" -Produkte und -Systeme (einschließlich Spezifikationen), aber es gibt auch viele Gründe, warum Sie möglicherweise eine "Binärzeichenfolge" erstellen, in der Sie nicht möchten, dass Unicode oder etwas, in das mehrere Bytes "zusammengeführt" werden sollen ein einzelnes Zeichen. Wir verwenden oft 'Strings', um Binärdaten zu enthalten, zum Beispiel um DNS-Anfragen zu stellen usw.
Jmons
Ich schlage vor, Folgendes hinzuzufügen, um die Antwort zu vervollständigen. In den meisten Fällen müssen wir Bytes aus unserem Betriebssystem dekodieren, z. B. die Konsolenausgabe. Die pythonischste Methode, die ich gefunden habe, ist import localeund dann os_encoding = locale.getpreferredencoding(). Auf diese Weise können wir mitmy_b_string.decode(os_encoding)
aturegano
2
@aturegano, es ist nicht die einzige Option. sys.getfilesystemencoding(), sys.stdin.encoding, sys.stdout.encoding. Meiner Meinung nach könnte die Verwendung dieser automatischen Codierungserkennung das Problem lösen, da das Unterprogramm (OP verwendet einen Unterprozess) auf andere Weise geschrieben werden könnte, um die Codierung zu bestimmen (oder sogar fest codiert). Trotzdem danke für das Feedback.
Falsetru
@falsetru Beachten Sie, dass sys.getfilesystemencoding()der Name der Codierung zurückgegeben wird, die zum Konvertieren zwischen Unicode-Dateinamen und Byte-Dateinamen verwendet wird, und stark vom verwendeten Betriebssystem abhängt. AFAIK, diese Funktion wird verwendet, um in die bevorzugte Darstellung des Systems zu konvertieren. Das bedeutet, dass es nicht auf die von der Konsole verwendete locale.getpreferredencoding()
Codierung
71

Wenn die Antwort von falsetru nicht funktioniert hat, können Sie auch versuchen:

>>> b'a string'.decode('utf-8')
'a string'
kame
quelle
0

Bitte beachten Sie das Büro encode()und die decode()Dokumentation aus der codecsBibliothek. utf-8ist die Standardcodierung für die Funktionen, aber in Python 3 gibt es mehrere Standardcodierungen wie latin_1oder utf_32.

Daniel Argüelles
quelle