I captured the standard output of an external program into a bytes
object:
>>> from subprocess import *
>>> command_stdout = Popen(['ls', '-l'], stdout=PIPE).communicate()[0]
>>>
>>> command_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'
I want to convert that to a normal Python string, so that I can print it like this:
>>> 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
I tried the binascii.b2a_qp()
method, but got the same bytes
object again:
>>> binascii.b2a_qp(command_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'
How do I convert the bytes
object to a str
with Python 3?
24条答案
按热度按时间vbopmzt11#
字节数
转换为字符串
方法一
或
方法二
或
方法三
或
结果
mfpqipee2#
尝试使用此函数;该函数将忽略所有非字符集(如
utf-8
)二进制文件,并返回一个干净的字符串。它经过python3.6
及更高版本的测试。在这里,该函数将获取二进制数据并对其进行解码(使用Python预定义的字符集将二进制数据转换为字符,
ignore
参数忽略二进制文件中的所有非字符集数据,并最终返回所需的string
值。如果您不确定编码,请使用
sys.getdefaultencoding()
获取设备的默认编码。p4rjhz4m3#
尝尝这个
nzk0hqpo4#
如果要转换任何字节,而不仅仅是将字符串转换为字节:
然而,这并不是很有效率。它将把一张2MB的图片变成9MB。
oogrdqng5#
vxbzzdmp6#
我们可以使用
bytes.decode(encoding='utf-8', errors='strict')
对Bytes对象进行解码以生成一个字符串,以用于文档编制。单击此处Python3
示例:产出:
注意:在Python3中,默认的编码类型是
utf-8
。因此,<byte_string>.decode("utf-8")
也可以写为<byte_string>.decode()
5fjcxozz7#
使用
.decode()
进行解码。这将对字符串进行解码。将'utf-8'
)作为值传递到内部。bybem2ql8#
从*sys — System-specific parameters and functions*开始:
要在标准流中写入或读取二进制数据,请使用底层二进制缓冲区。例如,要将字节写入标准输出,请使用
sys.stdout.buffer.write(b'abc')
。vzgqcmou9#
对于“运行外壳命令并以文本而不是字节形式获得其输出”的特定情况,在Python3.7上,您应该使用
subprocess.run
并传入text=True
(以及capture_output=True
来捕获输出)text
过去被称为universal_newlines
,在Python3.7中进行了更改(好吧,使用了别名)。如果要支持3.7之前的Python版本,请传入universal_newlines=True
而不是text=True
inkz8wg910#
For Python 3, this is a much safer and Pythonic approach to convert from
byte
tostring
:Output:
scyqe7ek11#
在处理Windows系统中的数据(行结尾为
\r\n
)时,我的答案是为什么?尝试使用多行Input.txt:
您的所有行尾都将加倍(到
\r\r\n
),从而导致额外的空行。Python的文本读取函数通常会规格化行尾,因此字符串只使用\n
。如果您从Windows系统接收二进制数据,则Python没有机会做到这一点。因此,将复制您的原始文件。
cclgggtu12#
我做了一个清理清单的函数
mf98qq9413#
对
bytes
对象进行解码以生成一个字符串:上面的例子假设
bytes
对象是UTF-8格式的,因为它是一种常见的编码。但是,您应该使用数据实际所在的编码!klsxnrf114#
如果您出现此错误:
utf-8 codec can't decode byte 0x8a
,那么最好使用以下代码将字节转换为字符串:
xiozqbni15#
如果您应该通过尝试
decode()
获得以下结果:AttributeError:“Str”对象没有属性“”Decode“”
您还可以在强制转换中直接指定编码类型: