также: Я считаю, что первый выход имеет тип bytes
, но что тип второго выхода? Моя догадка str
с кодировкой UTF-8 .
Закрыть, но не совсем верно. В Python3 тип str
индексируется Unicode с кодовыми точками (обратите внимание, что кодовые точки обычно, но не всегда, имеют соответствие 1: 1 с воспринимаемыми пользователем символами). Поэтому базовый код абстрагируется при использовании типа str
- считайте его незакодированным, хотя это принципиально не тот случай. Это тип bytes
, который индексируется как простой массив байтов и поэтому должен использовать конкретный encoding. В этом случае (как и в большинстве подобных случаев) ASCII
будет достаточным для декодирования того, что было создано сценарием подпроцесса.
python2 имеет различные значения по умолчанию для интерпретации str
типа (see here), так строковые литералы будут представлены по-разному в этой версии языка (эта разница может быть большим камнем преткновения при исследовании обработки текста).
Как человек, который в основном используется C++, я нашел следующий чрезвычайно поучительно о практическом хранении, кодировании и индексации текста Unicode: How do I use 3 and 4-byte Unicode characters with standard C++ strings?
Таким образом, ответ на первую часть вопрос заключается в bytes.decode()
:
a = a.decode('ascii') ## convert from `bytes` to 'str' type
хотя просто используя
a = a.decode() ## assumes UTF-8 encoding
обычно будет давать те же результаты, что и ASCII - это подмножество UTF-8.
В качестве альтернативы, вы можете использовать str()
так:
a = str(a,encoding='ascii')
, но обратите внимание, что здесь кодировка должна быть указана, если вы хотите «содержимое только» представление - в противном случае он будет на самом деле построить str
тип, который внутренне содержит символы кавычек (включая префикс «b»), что и происходит в первом выпуске, указанном в вопросе.
subprocess.check_output
обрабатывает данные в двоичном режиме (возвращение сырой последовательность байт) по умолчанию, но зашифрованное аргумент universal_newlines=True
в основном говорит его декодировать строку и представить его в виде текста (с использованием str
type). Это преобразование в тип str
необходимо (в Python3), если вы хотите отобразить вывод (и «только содержимое») с помощью функции print
Python.
Самое смешное в этом преобразовании заключается в том, что для этих целей он действительно ничего не делает с данными. Что происходит под капотом, это деталь реализации, но если данные являются ASCII (как это очень типично для этого типа программы), он по существу просто копируется из одного места в другое без какого-либо значимого перевода. Операция - это всего лишь hoop jumping, чтобы изменить тип данных - и, казалось бы, бессмысленный характер операции еще более запутывает большее видение обработки текста Python (для непосвященных). Кроме того, поскольку the docs не делают тип возвращаемых данных явным (по имени), трудно даже знать, с чего начать поиск соответствующей функции преобразования.
Вы пробовали декодировать выход? –
@ IgnacioVazquez-Abrams: Конечно, я попытался понять это, но мои первые несколько догадок не выходили за рамки. Я надеюсь, кто-то покажет мне, как это сделать. Что такое синтаксис? Каковы типы данных? и т. д. Я уверен, что это очень легко для людей, которые уже знают, как это сделать. Надеюсь, скоро я стану одним из этих людей. :) – nobar
Теперь, когда я знаю, что все называется, мне удалось найти [dup] (http://stackoverflow.com/questions/606191/convert-bytes-to-a-python-string). Основываясь на количестве полученных запросов, я думаю, справедливо утверждать, что документация для модуля подпроцесса может предоставить несколько советов по использованию, чтобы быть проще для обычного пользователя Python. – nobar