Преобразование байтов в строку в Python 3
Я захватил стандартный вывод внешней программы в объекте типа 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 ответ(ов)
Чтобы декодировать байтовую строку и преобразовать её в строку символов (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 строки являются байтовыми.
Я думаю, вам нужно вот это:
>>> 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 (или ознакомиться с ней здесь).
Вам нужно установить параметр universal_newlines
в значение True
, чтобы обеспечить совместимость с различными форматами новых строк. Вот как это можно сделать:
command_stdout = Popen(['ls', '-l'], stdout=PIPE, universal_newlines=True).communicate()[0]
Это позволит вам получить вывод команды в формате строки, а не в байтах, что упростит работу с результатом.
Если вы столкнулись с ошибкой:
utf-8 codec can't decode byte 0x8a,
то лучше использовать следующий код для преобразования байтов в строку:
bytes = b"abcdefg"
string = bytes.decode("utf-8", "ignore")
Параметр "ignore"
позволит игнорировать байты, которые не удается декодировать, и таким образом избежать возникновения ошибки.
"TypeError: требуется объект, похожий на bytes, а не 'str' при обработке содержимого файла в Python 3"
Есть ли в Python метод подстроки 'contains' для строк?
Объединение двух столбцов текста в DataFrame pandas
Как получить имя функции в виде строки?
Вывод строки в текстовый файл