代码之家  ›  专栏  ›  技术社区  ›  kriss

在python字符串之前的b前缀是什么意思?

  •  82
  • kriss  · 技术社区  · 15 年前

    在一个Python源代码中,我偶然发现了一个 在一个字符串之前,比如:

    b"abcdef"
    

    我知道 u 表示Unicode字符串的前缀,以及 r 原始字符串文本的前缀。

    什么是 b 代表什么类型的源代码是有用的,因为它看起来就像一个没有任何前缀的普通字符串?

    2 回复  |  直到 6 年前
        1
  •  53
  •   wRAR    15 年前

    这是Python 3。 bytes literal . 在Python2.5及更旧版本中,此前缀不存在(它相当于2.x的纯字符串,而3.x的纯字符串相当于 u 前缀在2.x)。在python 2.6+中,它相当于一个普通字符串, for compatibility with 3.x .

        2
  •  73
  •   Martijn Pieters    6 年前

    这个 b 前缀表示 bytes string literal .

    如果您看到它在python 3源代码中使用,那么表达式将创建一个 bytes object 不是正规的 Unicode str object . 如果您看到它在您的python shell中回响,或者作为列表、dict或其他容器内容的一部分,那么您会看到 字节 使用此符号表示的对象。

    字节 对象基本上包含一个0-255范围内的整数序列,但是当被表示时,python将这些字节显示为ASCII代码点,以便更容易地读取它们的内容。除此之外的任何字节 可印刷的 ASCII字符的范围显示为转义序列(例如 \n , \x82 等)。相反,您可以使用ASCII字符和转义序列来定义字节值;对于ASCII值,可以使用它们的数值(例如 b'A' = b'\x41' )

    因为A 字节 对象由整数序列组成,可以构造 字节 对象,来自值在0-255范围内的任何其他整数序列,如列表:

    bytes([72, 101, 108, 108, 111])
    

    索引会返回整数(但是切片会产生一个新的 字节 值;对于上面的示例, value[1] 给你 101 但是 value[:1] b'H' AS 72是大写字母的ASCII码位 H )

    字节 模型 二进制数据 包括 编码文 . 如果你 字节 值不包含文本,您需要首先使用正确的编解码器对其进行解码。例如,如果数据编码为UTF-8,则可以获得Unicode STR 值具有:

    strvalue = bytesvalue.decode('utf-8')
    

    相反,从 STR 对象到 字节 你需要 编码 . 您需要决定要使用的编码;默认情况下是使用UTF-8,但是您需要的是高度依赖于您的用例:

    bytesvalue = strvalue.encode('utf-8')
    

    也可以使用构造函数, bytes(strvalue, encoding) 做同样的事。

    解码和编码方法都需要一个额外的参数 specify how errors should be handled .

    python 2版本2.6和2.7还支持使用 b'..' 字符串文字语法,以简化在Python2和3上工作的代码。

    字节 对象是不可变的,就像 STR 字符串是。使用A bytearray() object 如果需要可变字节值。