将字节转换为字符串在Python 3中。

3717

我将外部程序的标准输出捕获到一个 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'

我想将其转换为普通的Python字符串,以便可以像这样打印:

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

如何将Python 3中的bytes对象转换为str

查看在Python 3中将字符串转换为字节的最佳方法以了解另一种方式。


156
为什么 str(text_bytes) 不起作用?这对我来说似乎很奇怪。 - Charlie Parker
71
因为str(text_bytes)无法指定编码方式。根据text_bytes中包含的内容,使用text_bytes.decode('cp1250')可能会得到与text_bytes.decode('utf-8')截然不同的字符串。 - Craig Anderson
17
现在的 str 函数不再自动将其它类型转换为字符串。由于某些原因,必须显式指定编码方式。只需要将编码方式设置为 utf-8 并检查你的代码是否正常工作即可。例如:var = var.decode('utf-8') - Charlie Parker
16
在Python 3中,unicode_text = str(bytestring, character_encoding) 可以正常工作。虽然 unicode_text = bytestring.decode(character_encoding) 更可取,以避免与仅为 bytes_obj 生成文本表示的 str(bytes_obj) 混淆,而不是将其解码为文本: str(b'\xb6', 'cp1252') == b'\xb6'.decode('cp1252') == '¶',并且 str(b'\xb6') == "b'\\xb6'" == repr(b'\xb6') != '¶' - jfs
3
此外,您可以将 text=True 传递给 subprocess.run().Popen(),然后您将获得一个字符串,无需转换字节。或者在任一函数中指定 encoding="utf-8" - David Gilbertson
@CharlieParker - 我从未遇到过使用str(<bytes>)时得到的字符串的用例,但也许只是为了与其他str调用保持一致。我本以为它们可以默认为UTF-8编码,但也许是因为Windows有太多奇怪的编码方式,所以它不会默认为UTF-8;但我同意你的观点。 - NeilG
24个回答

2

如果您想转换任何字节,而不仅仅是将字符串转换为字节:

最初的回答:

with open("bytesfile", "rb") as infile:
    str = base64.b85encode(imageFile.read())

with open("bytesfile", "rb") as infile:
    str2 = json.dumps(list(infile.read()))

这种方法并不是很高效。它会将一个2MB的图片变成9MB。最初的回答。

1
尝试使用这个函数;它会忽略所有非字符集(如UTF-8)的二进制,返回一个干净的字符串。它已经在Python 3.6及以上版本中进行了测试。
def bin2str(text, encoding = 'utf-8'):
    """Converts a binary to Unicode string by removing all non Unicode char
    text: binary string to work on
    encoding: output encoding *utf-8"""

    return text.decode(encoding, 'ignore')

在这里,该函数将接受二进制数据并对其进行解码(使用Python预定义的字符集将二进制数据转换为字符,并使用ignore参数忽略所有非字符集数据),最后返回所需的string值。
如果您不确定编码方式,请使用sys.getdefaultencoding()获取设备的默认编码方式。

1
转换为字符串而不关心任何编码类型的最佳方法之一如下所示 -
import json


b_string = b'test string'
string = b_string.decode(
    json.detect_encoding(b_string)  # detect_encoding - used to detect encoding
)
print(string)

在这里,我们使用了json.detect_encoding方法来检测编码。

-4
一个可能的答案:
#input string
istring = b'pomegranite'

# output string
ostring = str(istring)

3
没有一个编码可以给出 "b'pomegranite'"。很难看出这如何增加30多个现有答案。而且它是石榴。 - jonrsharpe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接