2013-03-29 32 views
22

在Python 3,一个可以格式化像一个字符串:Python的3个字节格式

"{0}, {1}, {2}".format(1, 2, 3) 

但如何格式化字节?

b"{0}, {1}, {2}".format(1, 2, 3) 

增加AttributeError: 'bytes' object has no attribute 'format'

如果没有format方法的字节,如何进行格式化或“重写”字节?

回答

18

而且自3.5 %格式化也将为bytes工作!

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

+0

sweet!我希望如此,因为这是你如何格式化C字符串,哈哈 – vitiral

+6

Lol。他们首先丢弃了2.x的功能或打破它们,返回u''文字(但是ur''是禁止的!),字节字符串格式化'open()'默认在系统特定的编码中打开 - 很好,在2.x中他们有字符串代码,如果与非-ascii符号,在3.x中,它们用代码打开,如果它在Windows机器上使用,它会被破坏,因为它的“本地”编码是ascii代码页。是否值得它首先打破兼容性,以便将功能的一半返回? –

+5

这样做意味着'%'不再计划弃用? –

10

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

你可以使用.join()的建议在这里:http://bugs.python.org/issue3982

b", ".join([b'1', b'2', b'3']) 

没有与.join()在使用.format()相关联的速度优势被BDFL本人表示:http://bugs.python.org/msg180449

+0

谢谢! BDFL的信息也很棒。但是,这并不能解决浮动的格式问题。知道除了'str(some_bytes).encode()' –

+0

了解之外是否还有其他方法会很有趣。一个用于字节的'.format()'方法似乎有望纳入3.4+ – bernie

+1

@bernie:但对象的'__format__'方法和内置'format'返回'str'。这将如何与'字节'和编码一起工作? – eryksun

5

另一种方法是:

"{0}, {1}, {2}".format(1, 2, 3).encode() 

在IPython 1.1.0上测试& Python 3 .2.3

+7

这不适用,如果你的格式参数是字节 – user3467349

1

我发现%的加工在Python 3.6.2最好的,它应该工作既为B “” 和 “”:

print(b"Some stuff %a. Some other stuff" % my_byte_or_unicode_string) 
+1

@克里斯好抓,3.6.2 –