Bytes in eine Zeichenkette umwandeln

Ich verwende diesen Code, um die Standardausgabe von einem externen Programm zu erhalten:

>>> from subprocess import *
>>> command_stdout = Popen(['ls', '-l'], stdout=PIPE).communicate()[0]

Die Methode communicate() gibt ein Array von Bytes zurück:

>>> command_stdout
b'total 0\n-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file1\n-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file2\n'

Ich würde jedoch gerne mit der Ausgabe als normaler Python-String arbeiten. So dass ich sie wie folgt ausgeben könnte:

>>> print(command_stdout)
-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file1
-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file2

Ich dachte, dafür sei die Methode binascii.b2a_qp() gedacht, aber als ich sie ausprobierte, erhielt ich wieder das gleiche Byte-Array:

>>> binascii.b2a_qp(command_stdout)
b'total 0\n-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file1\n-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file2\n'

Wie konvertiere ich den Byte-Wert zurück in einen String? Ich meine, indem ich die "Batterien" verwende, anstatt es manuell zu tun. Und ich möchte, dass es OK mit Python 3 ist.

Lösung

Sie müssen das Byte-Objekt dekodieren, um eine Zeichenkette zu erzeugen:

>>> b"abcde"
b'abcde'

# utf-8 is used here because it is a very common encoding, but you
# need to use the encoding your data is actually in.
>>> b"abcde".decode("utf-8") 
'abcde'
Kommentare (18)

Sie müssen die Byte-Zeichenkette dekodieren und in eine Zeichenkette (Unicode) umwandeln.

Bei Python 2

encoding = 'utf-8'
'hello'.decode(encoding)

oder

unicode('hello', encoding)

Bei Python 3

encoding = 'utf-8'
b'hello'.decode(encoding)

oder

str(b'hello', encoding)
Kommentare (0)

Ich glaube, Sie wollen das wirklich:

>>> from subprocess import *
>>> command_stdout = Popen(['ls', '-l'], stdout=PIPE).communicate()[0]
>>> command_text = command_stdout.decode(encoding='windows-1252')

Aarons Antwort war richtig, außer dass Sie wissen müssen, welche Kodierung Sie verwenden müssen. Und ich glaube, dass Windows 'windows-1252' verwendet. Es spielt nur eine Rolle, wenn Sie einige ungewöhnliche (Nicht-ASCII) Zeichen in Ihrem Inhalt haben, aber dann macht es einen Unterschied.

Übrigens ist die Tatsache, dass es eine Rolle spielt, der Grund, warum Python dazu übergegangen ist, zwei verschiedene Typen für Binär- und Textdaten zu verwenden: Es kann nicht auf magische Weise zwischen ihnen konvertieren, weil es die Kodierung nicht kennt, es sei denn, Sie sagen es ihm! Der einzige Weg, wie SIE es wissen können, ist, die Windows-Dokumentation zu lesen (oder lesen Sie hier).

Kommentare (2)