Jak przekonwertować „ciąg binarny” na normalny ciąg w Python3?

257

Na przykład mam taki ciąg (zwracana wartość subprocess.check_output):

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

Cokolwiek zrobiłem, zawsze jest drukowane z irytującym b'przed ciągiem:

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

Czy ktoś ma jakieś pomysły na temat używania go jako normalnego ciągu lub konwersji go na normalny ciąg?

Hanfei Sun
źródło
Możliwy duplikat Konwertuj bajty na ciąg?
Georgy,
@ HanfeiSun to, co nazywamy „ łańcuchem binarnym ”, to obiekt bajtów (zobacz informacje o obiekcie bajtów w bibliotece standardowej )
loved.by.Jesus

Odpowiedzi:

357

Odkoduj to.

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

Aby pobrać bajty z ciągu, zakoduj go.

>>> 'a string'.encode('ascii')
b'a string'
falsetru
źródło
27
@lyomi, użyłem, asciiponieważ podany ciąg został wykonany z liter ascii. Nie musisz określać kodowania, jeśli jest to kodowanie utf-8(domyślne w Pythonie 3.x zgodnie z str.encode, bytes.decodedoc-string)
falsetru
2
@lyomi W 2016 roku (i prawie na końcu) ludzie nadal używają ascii. Istnieje wiele „starszych” produktów i systemów (w tym specyfikacji), ale jest też wiele powodów, dla których możesz tworzyć „ciąg binarny”, w którym nie chcesz, aby Unicode lub coś próbowało „scalić” wiele bajtów w pojedynczy znak. Często używamy „ciągów” do przechowywania danych binarnych, na przykład
wysyłając
Proponuję dodać następujące, aby wypełnić odpowiedź. W większości przypadków musimy dekodować bajty z naszego systemu operacyjnego, takie jak dane wyjściowe konsoli, najbardziej pythonicznym sposobem, jaki to zrobiłem, to import localei wtedy os_encoding = locale.getpreferredencoding(). W ten sposób możemy dekodować za pomocąmy_b_string.decode(os_encoding)
aturegano
2
@aturegano, To nie jedyna opcja. sys.getfilesystemencoding(), sys.stdin.encoding, sys.stdout.encoding. IMHO, użycie tych automatycznych detekcji kodowania może rozwiązać problem, ponieważ podprogram (OP używa podproces) może zostać napisany w inny sposób, aby określić kodowanie (lub nawet zakodowane na stałe). W każdym razie dziękuję za opinie.
falsetru
@falsetru Uwaga, która sys.getfilesystemencoding()zwraca nazwę kodowania używanego do konwersji między nazwami plików Unicode i nazwami bajtów i jest silnie zależna od używanego systemu operacyjnego. AFAIK, ta funkcja służy do konwersji na preferowaną reprezentację systemu. Oznacza to, że nie będzie wnioskować o kodyfikacji używanej przez konsolę, którą można uzyskać za pomocą wyżej wspomnianej locale.getpreferredencoding()funkcji
aturegano
71

Jeśli odpowiedź z falsetru nie zadziała, możesz także spróbować:

>>> b'a string'.decode('utf-8')
'a string'
Kame
źródło
0

Zobacz oficjalną encode()i decode()dokumentację z codecsbiblioteki. utf-8jest domyślnym kodowaniem funkcji, ale istnieją wersje szeregowe w Pythonie 3 standardowe kodowania , takie jak latin_1lub utf_32.

Daniel Argüelles
źródło