[英]python strings and binary data
我的问题是关于python 3.0字符串。
我的理解是,对于行str = "a"
,字符'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类型?
你很困惑。 “编码”属于字节字符串 ,而不是unicode字符串 。 有意义的语句:“此字节字符串是utf-8编码的。”,“此字节字符串长度为2个字节。” 无意义的语句:“这个unicode字符串是utf-8编码的”,“这个unicode字符串是2个字节长”
str = "a"
表示“创建一个unicode字符串'a'和一个名为str
的引用”。 Unicode字符串当然存储在某种编码中,因为它需要在内存中作为字节存在,但这并不重要。 您的所有代码都将其视为根本没有编码 - 它已从字节中抽象出来。 unicode字符串是一系列unicode代码点 (即表示字符的整数)。 str
here( read()
的返回值)是字节字符串 ,而不是unicode字符串 。 "a" != b"a"
。 str
具有未知编码 ,必须进行解码才能生成unicode字符串。 字节字符串没有encode()
方法,因为它没有意义 - 它们或者已经是unicode字符串的编码,或者它们根本不表示unicode字符串(例如图像)。 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
对象。 该对象的内容应该完全反映文件的内容。 请注意,它不是 str
类型,它不是unicode,它甚至不是Python字符串。 要将字节转换为字符串,您需要使用.decode()
方法显式解码。
从bytes
值中简单地创建一个bytearray
,只需在其上调用bytesarray()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.