Як перетворити "двійковий рядок" у звичайний рядок в 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 те, що ви називаєте " двійковим рядком ", є об'єктом байтів (див. Інформацію про
байтний

Відповіді:


357

Розшифруйте його.

>>> 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.decodedoc-string)
falsetru

2
@lyomi У 2016 році (і майже до кінця) люди все ще використовують ascii. Існує багато багатьох "застарілих" продуктів і систем (включаючи технічні характеристики), але є також багато причин, чому ви можете створювати "двійкову рядок", де вам не потрібно unicode або щось, щоб спробувати і "об'єднати" кілька байтів у єдиний персонаж. Ми часто використовуємо "рядки", щоб містити двійкові дані, наприклад, для запитів 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. IMHO, використовуючи автоматичне виявлення кодування, може вирішити проблему, оскільки підпрограма (OP використовує підпроцес) може бути записана іншим способом визначення кодування (або навіть жорстко кодованого). Дякуємо за відгук.
фальсетру

@falsetru Зауважте, що sys.getfilesystemencoding()повертає ім'я кодування, яке використовується для перетворення між іменами файлів Unicode і байтами, і сильно залежить від операційної системи, яку ви використовуєте. AFAIK, ця функція використовується для перетворення до кращого представлення системи. Це означає, що він не може зробити висновок про кодифікацію, використану консоллю, яку можна отримати за допомогою вищезгаданої locale.getpreferredencoding()функції
aturegano


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.