string - 转换Python字符串的字节

  显示原文与译文双语对照的内容

我正在使用这里代码从外部程序获取标准输出:


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

communicate() 方法返回字节数组:


>>> command_stdout
b'total 0n-rw-rw-r-- 1 thomas thomas 0 Mar 3 07:03 file1n-rw-rw-r-- 1 thomas thomas 0 Mar 3 07:03 file2n'

但是,我想使用输出作为普通的python 字符串。 这样我就可以像这样打印:


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

我认为 binascii.b2a_qp() 方法是这样的,但是当我尝试它时,我再次得到了同样的字节数组:


>>> binascii.b2a_qp(command_stdout)
b'total 0n-rw-rw-r-- 1 thomas thomas 0 Mar 3 07:03 file1n-rw-rw-r-- 1 thomas thomas 0 Mar 3 07:03 file2n'

谁知道如何将字节值转换回字符串? 我的意思是,使用"电池"而不是手工进行。 我希望 python 3可以使用它。

时间:

你需要解码字节字符串并将它的转换成字符( unicode ) 字符串。


b'hello'.decode(encoding)

或者


str(b'hello', encoding)

我想你真正想要的是:


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

aaron的回答是正确的,除了你需要知道使用哪个编码。 我相信 Windows 使用'windows-1252'。 如果你有一些不寻常的( non-ascii ) 只会重要角色在你的内容,然后将产生影响。

顺便说一句,事实是 python 向二进制和文本数据使用两种不同类型的原因: 它不能在它们之间神奇地转换,因为它不知道编码,除非你告诉它 ! 你知道的唯一方法是读取 Windows 文档( 或者在这里阅读) 。

如果你不知道编码,那么在 python 3中读取二进制输入的可靠方法是使用古代 MS-DOS cp437 编码:


PY3K = sys.version_info> = (3, 0)

lines = []
for line in stream:
 if not PY3K:
 lines.append(line)
 else:
 lines.append(line.decode('cp437'))

由于编码未知,需要非英语符号转换为 cp437 ( 英语字符不被翻译,因为它们在大多数单一字节编码和UTF-8中匹配)的字符。

将任意二进制输入解码为UTF-8是不安全的,因为你可能会得到:


>>> b'x00x01xffsd'.decode('utf-8')
Traceback (most recent call last):
 File"<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 2: invalid
start byte

这同样适用于 latin-1, 流行的python ( 默认) 2.? 查看代码页布局中缺少的点- 它是 python的扼流圈 ordinal not in range

P.S 。我曾经是像你这样的python fanboy,然后我在范围内不接受序号。

...