python字符串和二进制数据

时间:2013-04-03 15:09:47

标签: python python-3.x

我的问题是关于python 3.0字符串。

  1. 我的理解是,对于第str = "a"行,字符“' a'被编码(例如使用utf-8)并存储在str对象中。如果UTF-8代表' a'是1个字节,字符串是1个字节长。我是对的吗?

  2. 如果上述情况属实,当我们使用read()读取二进制文件时会发生什么。假设我有一个带有两个字节的二进制数据的双字节文件,我使用读取命令(如

    )在字符串中读取它
    open(fileName, mode='rb') 
        str= file.read()
    

    现在str将是两个字节长,每个字节将存储在fileName中。我是对的吗?

  3. 如果我在上述方面是对的,那么str对象不是任何特定的编码格式(如UTF等),那么python字符串总是unicode是什么意思呢?如果我调用str.encode()会发生什么。这没有意义吗?

  4. 从文件读取的str对象实际上是一个字节数组。有没有办法将其转换为bytearray类型?

3 个答案:

答案 0 :(得分:2)

你很困惑。 "编码"属于字节字符串,而不属于 unicode字符串。有意义的陈述:"这个字节串是utf-8编码的。","这个字节串长2个字节。"无意义的语句:"这个unicode字符串是utf-8编码","这个unicode字符串长2个字节"

  1. str = "a"表示"创建一个unicode字符串' a'并且引用它命名为str"。当然,Unicode字符串在某些编码中存储,因为它需要在内存中作为字节存在,但这是不相关的。您的所有代码都将其视为根本没有编码 - 它已从字节中抽象出来。 unicode字符串是一系列unicode代码点(即表示字符的整数)。
  2. 是和否。 str此处(read()的返回值)是字节字符串,而不是 unicode字符串"a" != b"a"
  3. 您的字节字符串str拥有未知编码,必须解码才能生成unicode字符串。字节字符串没有encode()方法,因为它没有意义 - 它们或者已经是unicode字符串的编码,或者它们根本不代表unicode字符串(例如图像)。
  4. 它不是一个字节数组,它是一个字节字符串。 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()方法明确解码。

bytearraybytes值创建,只需在其上调用bytesarray()