Python 3字节格式化

Eci*_*ana 44 python string-formatting python-3.x

在Python 3中,可以格式化一个字符串,如:

"{0}, {1}, {2}".format(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

但是如何格式化字节?

b"{0}, {1}, {2}".format(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

加油AttributeError: 'bytes' object has no attribute 'format'.

如果没有format字节方法,如何格式化或"重写"字节?

Eci*_*ana 36

从3.5 %格式也适用于bytes!

https://mail.python.org/pipermail/python-dev/2014-March/133621.html

  • 但为什么支持`%`而不是`format()`? (11认同)
  • @EcirHana同意.很高兴看到"哦,是的,还记得我们在3.1发布的弃用通知吗?好吧,有趣的故事...."更新. (9认同)
  • 大声笑.他们首先丢弃了2.x的特征或打破了它们,然后将它们带回来.你的文字(但你的''是禁止的!),字节串格式化.`open()`默认情况下在系统特定的编码中打开 - 很好,在2.x中他们有字符串代码,如果与非ascii符号一起使用就会破坏,在3.x中他们用代码替换它,如果它在windows上使用则会中断机器,因为它的"本地"编码是ascii代码页.首先打破兼容性以恢复一半功能是否值得? (7认同)
  • 这是否意味着`%`不再安排弃用? (7认同)
  • @JS.我会说"*将*%格式添加到字节和bytearray"(PEP 461)与"*deprecation*"相矛盾. (5认同)

小智 15

另一种方式是:

"{0}, {1}, {2}".format(1, 2, 3).encode()
Run Code Online (Sandbox Code Playgroud)

在IPython 1.1.0和Python 3.2.3上测试过

  • 如果您的格式参数是字节,则这不起作用. (10认同)
  • 当您需要在流中插入 Unicode 不支持的硬字节代码时,这不起作用。 (5认同)

ber*_*nie 12

有趣的.format()是,字节序列似乎不支持; 正如你所展示的那样.

您可以.join()按照此处的建议使用:http://bugs.python.org/issue3982

b", ".join([b'1', b'2', b'3'])
Run Code Online (Sandbox Code Playgroud)

与BDFL本人所显示的.join()过度使用相关的速度优势.format():http://bugs.python.org/msg180449

  • @bernie:[`bytes.format()`pep is withdrawn](https://www.python.org/dev/peps/pep-0460/).[在Python 3.5中引入了printf样式格式(%-interpolation)](https://www.python.org/dev/peps/pep-0461/) (3认同)

iva*_*lan 10

我发现%b在 Python 3.6.2 中效果最好,它应该适用于 b"" 和 "":

print(b"Some stuff %b. Some other stuff" % my_byte_or_unicode_string)
Run Code Online (Sandbox Code Playgroud)

  • 对于字节字符串,它应该是 `%b` 而不是 `%a`,否则包含 'b' 前缀 (2认同)
  • 它不适用于 unicode 字符串。仅支持 b''。 (2认同)

Nur*_*yev 5

对于 Python 3.6+,您可以使用这种简洁明了的语法:

f'foo {bar}'.encode() # a byte string
Run Code Online (Sandbox Code Playgroud)

  • 这对“str”进行格式化,而不是对“bytes”进行格式化。例如,如果“bar”是“bytes”对象,则不会给出预期结果。或者,如果您想将非 ASCII 字节值放入格式字符串中。 (5认同)
  • 这实际上是 [Schcriher 的答案](/a/21021433/4518341) 的重复,并且具有完全相同的问题。 (4认同)