38

Преобразование байтов в строку в Python 3

17

Я захватил стандартный вывод внешней программы в объекте типа bytes. Вот как это выглядит:

from subprocess import *
stdout = Popen(['ls', '-l'], stdout=PIPE).communicate()[0]
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'

Я хочу преобразовать этот объект bytes в обычную строку Python (str), чтобы я мог вывести его с помощью команды:

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

Как мне сделать так, чтобы преобразовать объект bytes в str в Python 3?

4 ответ(ов)

4

Чтобы декодировать байтовую строку и преобразовать её в строку символов (Unicode) в Python, вы можете использовать следующий код в зависимости от версии Python, которую вы используете.

Python 3:

Для декодирования байтовой строки в строку Unicode вы можете использовать метод .decode() или функцию str():

encoding = 'utf-8'
result = b'hello'.decode(encoding)
# или
result = str(b'hello', encoding)

Python 2:

В Python 2 вы можете использовать метод .decode() на строке или функцию unicode():

encoding = 'utf-8'
result = 'hello'.decode(encoding)
# или
result = unicode('hello', encoding)

Эти примеры показывают, как преобразовать байтовую строку в строку Unicode, используя кодировку UTF-8. Не забывайте, что в Python 3 строки по умолчанию являются текстовыми (Unicode), в то время как в Python 2 строки являются байтовыми.

0

Я думаю, вам нужно вот это:

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

Ответ Аарона был правильным, за исключением того, что вам нужно знать, какое кодирование использовать. Я полагаю, что Windows использует 'windows-1252'. Это будет иметь значение, если в вашем содержимом есть какие-то неординарные (не ASCII) символы, и в этом случае это сделает разницу.

Кстати, тот факт, что это имеет значение, является причиной, по которой Python перешел на использование двух разных типов для бинарных и текстовых данных: он не может магическим образом конвертировать между ними, потому что не знает кодировку, если вы не скажете! Единственный способ, как ВЫ можете это узнать, — это прочитать документацию Windows (или ознакомиться с ней здесь).

0

Вам нужно установить параметр universal_newlines в значение True, чтобы обеспечить совместимость с различными форматами новых строк. Вот как это можно сделать:

command_stdout = Popen(['ls', '-l'], stdout=PIPE, universal_newlines=True).communicate()[0]

Это позволит вам получить вывод команды в формате строки, а не в байтах, что упростит работу с результатом.

0

Если вы столкнулись с ошибкой:

utf-8 codec can't decode byte 0x8a,

то лучше использовать следующий код для преобразования байтов в строку:

bytes = b"abcdefg"
string = bytes.decode("utf-8", "ignore")

Параметр "ignore" позволит игнорировать байты, которые не удается декодировать, и таким образом избежать возникновения ошибки.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь