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