Как преобразовать двоичную строку в обычную строку в Python3?


258

Например, у меня есть такая строка (возвращаемое значение subprocess.check_output):

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

Что бы я ни делал с этим, оно всегда печатается с раздражающей b'строкой:

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

У кого-нибудь есть идеи о том, как использовать его как нормальную строку или преобразовать в нормальную строку?



@HanfeiSun то, что вы называете « двоичной строкой », является байтовым объектом (см. Информацию об
байтовом

Ответы:


358

Расшифруйте это.

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

Чтобы получить байты из строки, закодируйте ее.

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

27
@lyomi, я использовал, asciiпотому что данная строка была сделана из букв ascii. Вам не нужно указывать кодировку , если кодировка utf-8( по умолчанию в Python 3.x в соответствии str.encode, bytes.decodeдок-строка)
falsetru

2
@lyomi В 2016 году (и это почти конец) люди все еще используют ascii. Существует много «устаревших» продуктов и систем (включая спецификации), но есть также множество причин, по которым вы можете создавать «двоичную строку», в которой вам не нужен юникод или что-то, что пытается «объединить» несколько байтов в один персонаж. Мы часто используем «строки» для хранения двоичных данных, например, для выполнения DNS-запросов и т. Д.
Jmons

Я предлагаю добавить следующее, чтобы завершить ответ. В большинстве случаев нам нужно декодировать байты из нашей операционной системы, такие как вывод на консоль, самый питонический способ, который я нашел для этого, - это import localeпотом os_encoding = locale.getpreferredencoding(). Таким образом, мы можем декодировать, используяmy_b_string.decode(os_encoding)
aturegano

2
@aturegano, это не единственный вариант. sys.getfilesystemencoding(), sys.stdin.encoding, sys.stdout.encoding. ИМХО, использование этого автоматического обнаружения кодирования может решить проблему, потому что подпрограмма (OP использует подпроцесс) может быть написана другим способом определения кодировки (или даже жестко закодирована). В любом случае, спасибо за отзыв.
falsetru

@falsetru Обратите внимание, что sys.getfilesystemencoding()возвращает имя кодировки, используемой для преобразования между именами файлов Unicode и именами байтов, и сильно зависит от используемой операционной системы. AFAIK, эта функция используется для преобразования в предпочтительное представление системы. Это означает, что он не выведет кодификацию, используемую консолью, которая может быть получена с использованием вышеупомянутой locale.getpreferredencoding()функции
aturegano

71

Если ответ от falsetru не сработал, вы также можете попробовать:

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.