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

这是一个Python 101types的问题,但是当我尝试使用一个似乎将我的stringinput转换为字节的包时,它让我感到莫名其妙。

正如你将在下面看到的,我为自己find了答案,但是我觉得这是值得在这里logging的,因为我花时间去挖掘正在发生的事情。 它似乎是Python 3的通用,所以我没有提到我正在玩的原始包; 它似乎不是一个错误(只是特定的包有一个.tostring()方法,显然产生我所理解的string…)

我的testing程序是这样的:

 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) 

这段代码的输出给出了这个:

 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' 

所以,需要能够在字节和string之间进行转换,以避免非ASCII字符变成gobbledegook。

上面的代码示例中的“mangler”与此相当:

 bytesThing = stringThing.encode(encoding='UTF-8') 

还有其他的方法来写这个(特别是使用bytes(stringThing, encoding='UTF-8') ,但是上面的语法使得它明显地发生了什么,以及如何恢复string:

 newStringThing = bytesThing.decode(encoding='UTF-8') 

当我们这样做时,原始string被恢复。

注意,使用str(bytesThing)只是转录所有的gobbledegook而不把它转换回Unicode,除非你特别要求UTF-8,也就是str(bytesThing, encoding='UTF-8') 。 如果未指定编码,则不报告错误。

在python3中,有一个与encode()相同格式的bytes()方法。

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

在文档中我没有读到任何关于这个的信息,但也许我没有find正确的地方。 这样你就可以显式地将string转换成字节stream,并且比使用encodedecode更具可读性,而且不需要在引号之前。

尝试这个:

 StringVariable=ByteVariable.decode('UTF-8','ignore') 

testingtypes:

 print(type(StringVariable)) 

这里'StringVariable'表示为一个string。 “ByteVariable”表示为Byte。 它不相关的问题variables..