如何在Python 3中的字节和字符串之间进行转换?

Bob*_*ble 69 string byte python-3.x

这是一个Python 101类型的问题,但是当我尝试使用似乎将我的字符串输入转换为字节的包时,我感到困惑了一段时间.

正如您将在下面看到的,我找到了自己的答案,但我觉得这里值得记录,因为我花了很长时间才发现了正在发生的事情.它似乎是Python 3的通用,所以我没有提到我正在玩的原始包; 它似乎不是一个错误(只是特定的包有一个.tostring()方法明显没有产生我理解为字符串...)

我的测试程序是这样的:

import mangler                                 # spoof package

stringThing = """
<Doc>
    <Greeting>Hello World</Greeting>
    <Greeting>??</Greeting>
</Doc>
"""

# print out the input
print('This is the string input:')
print(stringThing)

# now make the string into bytes
bytesThing = mangler.tostring(stringThing)    # pseudo-code again

# now print it out
print('\nThis is the bytes output:')
print(bytesThing)
Run Code Online (Sandbox Code Playgroud)

此代码的输出给出了:

This is the string input:

<Doc>
    <Greeting>Hello World</Greeting>
    <Greeting>??</Greeting>
</Doc>


This is the bytes output:
b'\n<Doc>\n    <Greeting>Hello World</Greeting>\n    <Greeting>\xe4\xbd\xa0\xe5\xa5\xbd</Greeting>\n</Doc>\n'
Run Code Online (Sandbox Code Playgroud)

因此,需要能够在字节和字符串之间进行转换,以避免最终将非ascii字符转换为gobbledegook.

Bob*_*ble 103

上面代码示例中的'mangler'就是这样做的:

bytesThing = stringThing.encode(encoding='UTF-8')
Run Code Online (Sandbox Code Playgroud)

还有其他方法可以写这个(特别是使用bytes(stringThing, encoding='UTF-8'),但上面的语法使得它显而易见,以及如何恢复字符串:

newStringThing = bytesThing.decode(encoding='UTF-8')
Run Code Online (Sandbox Code Playgroud)

当我们这样做时,恢复原始字符串.

注意,str(bytesThing)除非您特别请求UTF-8,即使用只转录所有gobbledegook而不将其转换回Unicode str(bytesThing, encoding='UTF-8').如果未指定编码,则不会报告错误.


Nuc*_*eon 13

在python3中,有一种bytes()方法与格式相同encode().

str1 = b'hello world'
str2 = bytes("hello world", encoding="UTF-8")
print(str1 == str2) # Returns True
Run Code Online (Sandbox Code Playgroud)

我没有在文档中读到任何关于此的内容,但也许我没有找到正确的地方.通过这种方式,您可以明确地将字符串转换为字节流,并使其比使用encode和更具可读性decode,并且无需b在引号前优先使用.


plu*_*ash 5

这是一个 Python 101 类型的问题,

这是一个简单的问题,但答案并不那么简单。


在python3中,“bytes”对象表示字节序列,“string”对象表示unicode代码点序列。

要在从“字节”到“字符串”以及从“字符串”到“字节”之间进行转换,您可以使用 bytes.decode 和 string.encode 函数。这些函数采用两个参数,一个编码和一个错误处理策略。

遗憾的是,在很多情况下使用字节序列来表示文本,但不一定明确定义所使用的编码。以类 Unix 系统上的文件名为例,就内核而言,它们是具有少量特殊值的字节序列,在大多数现代发行版中,大多数文件名将是 UTF-8,但不保证所有文件名都将是。

如果您想编写健壮的软件,那么您需要仔细考虑这些参数。您需要仔细考虑字节应该采用什么编码,以及如何处理它们不是您认为应该采用的编码的有效字节序列的情况。Python 默认为 UTF-8并在任何无效的 UTF-8 字节序列上出错。

打印(字节的东西)

Python 使用“repr”作为到字符串的后备转换。repr 尝试生成将重新创建对象的 python 代码。在字节对象的情况下,这意味着在可打印的 ascii 范围之外转义字节。