我的问题是关于python 3.0字符串。
我的理解是,对于第str = "a"
行,字符“' a'被编码(例如使用utf-8)并存储在str对象中。如果UTF-8代表' a'是1个字节,字符串是1个字节长。我是对的吗?
如果上述情况属实,当我们使用read()读取二进制文件时会发生什么。假设我有一个带有两个字节的二进制数据的双字节文件,我使用读取命令(如
)在字符串中读取它open(fileName, mode='rb')
str= file.read()
现在str
将是两个字节长,每个字节将存储在fileName中。我是对的吗?
如果我在上述方面是对的,那么str对象不是任何特定的编码格式(如UTF等),那么python字符串总是unicode是什么意思呢?如果我调用str.encode()会发生什么。这没有意义吗?
从文件读取的str
对象实际上是一个字节数组。有没有办法将其转换为bytearray类型?
答案 0 :(得分:2)
str = "a"
表示"创建一个unicode字符串' a'并且引用它命名为str
"。当然,Unicode字符串在某些编码中存储,因为它需要在内存中作为字节存在,但这是不相关的。您的所有代码都将其视为根本没有编码 - 它已从字节中抽象出来。 unicode字符串是一系列unicode代码点(即表示字符的整数)。str
此处(read()
的返回值)是字节字符串,而不是 unicode字符串。 "a" != b"a"
。str
拥有未知编码,必须解码才能生成unicode字符串。字节字符串没有encode()
方法,因为它没有意义 - 它们或者已经是unicode字符串的编码,或者它们根本不代表unicode字符串(例如图像)。bytearray
是可变字节列表。您可以使用bytearray(byte_string)
生成一个bytearray,但bytearrays用于相当专业的用途(例如,避免复制send-recv缓冲区),而不是随意使用。通常你只需要一个字节串。答案 1 :(得分:0)
当您以二进制模式读取文件时,read()
方法返回的值是bytes
对象,而不是str
对象。文档深入探讨了这一点。
>>> with open('foo', mode='rb') as f: s = f.read()
...
>>> s
b'abc\n'
>>> len(s)
4
>>> type(s)
<class 'bytes'>
答案 2 :(得分:0)
Python字符串存储 Unicode代码点。
代码点与字节不同。字节是数字的计算机表示(通常在0到255之间),并且这些数字可以通过解码过程转换为代码点,而在另一个方向上通过编码转换。 Python 3字符串包含代码点,文本中每个字符都有一个。
Python源代码可以使用一系列字节定义字符串文字,默认情况下解释器使用UTF-8编解码器解码为unicode,但您可以在文件顶部设置其他编解码器。在磁盘上,UTF-8编码中的字母a
确实只是一个字节,这是UTF-8标准的性质。
如果您在文本模式下读取文件,Python会自动为您应用解码过程,但是当您以二进制模式打开它时,不会进行解码,而是获得bytes
对象。该对象的内容应该完全反映文件的内容。请注意,类型为str
的不,它不是unicode,甚至不是Python字符串。要将字节转换为字符串,您需要使用.decode()
方法明确解码。
bytearray
从bytes
值创建,只需在其上调用bytesarray()
。