首页 文章

python字符串和二进制数据

提问于
浏览
0

我的问题是关于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 回答

  • 2

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

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

    你很困惑 . "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缓冲区),而不是偶然使用 . 通常你只需要一个字节串 .

  • 0

    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() 即可 .

相关问题