0

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

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

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

    open(fileName, mode='rb') 
        str= file.read()
    

    现在str将是两个字节长,每个字节将是存储在文件名中的内容。我对吗?

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

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

4

3 回答 3

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. 它不是字节数组,而是字节串。Abytearray是一个可变的字节列表。您可以使用 生成字节数组bytearray(byte_string),但字节数组旨在用于相当专业的用途(例如,避免复制发送-接收缓冲区),而不是随意使用。通常你只需要一个字节字符串。
于 2013-04-03T15:27:25.547 回答
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'>
于 2013-04-03T15:21:15.297 回答
0

Python 字符串存储Unicode 代码点

代码点与字节不同。字节是数字的计算机表示(通常在 0 到 255 之间),这些数字可以通过解码过程转换为代码点,并在编码的另一个方向上转换。Python 3 字符串包含代码点,文本中的每个字符一个。

Python 源代码可以使用一系列字节定义字符串文字,解释器默认使用 UTF-8 编解码器将其解码为 un​​icode,但您可以在文件顶部设置其他编解码器。在磁盘上,UTF-8 编码的字母a确实只有一个字节,这就是 UTF-8 标准的本质。

如果您以文本模式读取文件,Python 会自动为您应用解码过程,但是当您以二进制模式打开文件时,不会进行解码,bytes而是会得到一个对象。该对象的内容应该准确地反映文件的内容。请注意,它不是type str,它不是 unicode,甚至不是 Python 字符串。要将字节转换为字符串,您需要使用该.decode()方法显式解码。

Abytearray是从一个bytes值创建的,只需调用bytesarray()它。

于 2013-04-03T15:22:46.017 回答