【问题标题】:python strings and binary datapython字符串和二进制数据
【发布时间】:2013-03-25 08:16:30
【问题描述】:

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

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

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

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

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

  3. 1234563如果我调用 str.encode() 也会发生什么。没有意义?
  4. 由于从文件中读取的str 对象实际上是一个字节数组。有什么办法可以把它转成bytearray类型?

【问题讨论】:

  • 您确实需要阅读Python Unicode HOWTOthis article 以获得良好的衡量标准。
  • 您真的不想将您的字符串命名为str。尤其是当您询问 strbytes 对象时,这比仅仅隐藏内置对象更加令人困惑。

标签: python python-3.x


【解决方案1】:

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

  1. str = "a" 的意思是“创建一个 unicode 字符串 'a' 和一个名为 str 的引用”。 Unicode 字符串当然以某种编码方式存储,因为它需要作为字节存在于内存中,但这并不重要。您的所有代码都将其视为根本没有编码 - 它已从字节中抽象出来。一个 unicode 字符串是一个 unicode 代码点序列(即表示字符的整数)。
  2. 是和不是。 str 这里(read() 的返回值)是一个 byte 字符串,而不是 unicode 字符串"a" != b"a"
  3. 您的字节字符串str 拥有一个未知编码,必须解码 以生成一个unicode 字符串。字节字符串没有 encode() 方法,因为它没有意义——它们要么已经是 unicode 字符串的编码,要么根本不代表 unicode 字符串(例如图像)。
  4. 它不是一个字节数组,它是一个字节串。 bytearray 是一个可变字节列表。您可以使用bytearray(byte_string) 生成字节数组,但字节数组旨在用于相当专门的用途(例如,避免复制发送-接收缓冲区),而不是随意使用。通常你只需要一个字节串。

【讨论】:

    【解决方案2】:

    Python 字符串存储 Unicode 代码点

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

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

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

    bytearraybytes 值创建,只需调用 bytesarray() 即可。

    【讨论】:

      【解决方案3】:

      当您以二进制模式读取文件时,read() 方法返回的值是bytes 对象,而不是str 对象。文档对此进行了深入介绍。

      >>> with open('foo', mode='rb') as f: s = f.read()
      ... 
      >>> s
      b'abc\n'
      >>> len(s)
      4
      >>> type(s)
      <class 'bytes'>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-09
        • 2015-11-21
        • 1970-01-01
        • 1970-01-01
        • 2010-10-16
        • 2014-09-15
        • 2017-08-08
        • 2011-03-16
        相关资源
        最近更新 更多