Converteer bytes naar een string

Ik gebruik deze code om standaard output te krijgen van een extern programma:

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

De communicate() methode retourneert een array van bytes:

>>> 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'

Ik'zou echter willen werken met de uitvoer als een normale Python string. Zodat ik het als volgt zou kunnen printen:

>>> 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

Ik dacht dat'daar de binascii.b2a_qp() methode voor is, maar toen ik het probeerde, kreeg ik weer dezelfde 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'

Hoe converteer ik de bytes waarde terug naar string? Ik bedoel, met behulp van de "batterijen" in plaats van het handmatig te doen. En ik'zou graag willen dat het in orde is met Python 3.

Oplossing

Je moet het bytes object decoderen om een string te produceren:

>>> 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'
Commentaren (18)

U moet de bytestring decoderen en omzetten in een tekenreeks (Unicode).

Op Python 2

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

of

unicode('hello', encoding)

Op Python 3

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

of

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

Ik denk dat je dit echt wilt:

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

Aaron's antwoord was correct, behalve dat je moet weten welke codering je moet gebruiken. En ik geloof dat Windows 'windows-1252' gebruikt. Het maakt alleen uit als je wat ongebruikelijke (niet-ASCII) tekens in je inhoud hebt, maar dan maakt het wel verschil.

Trouwens, het feit dat het wel uitmaakt is de reden dat Python is overgestapt op het gebruik van twee verschillende types voor binaire en tekst data: het kan'niet op magische wijze tussen beide converteren, omdat het de codering niet kent tenzij jij het vertelt! De enige manier waarop JIJ het zou weten is door de Windows documentatie te lezen (of lees het hier).

Commentaren (2)