我正在寻找格式化的字节字符串文字。具体来说,相当于
的东西name = "Hello"
bytes(f"Some format string {name}")
可能类似于fb"Some format string {name}"
。
这样的事情存在吗?
答案 0 :(得分:18)
没有。 The idea is explicitly dismissed in the PEP:
出于同样的原因,我们不支持
bytes.format()
,您可以 不要将'f'
与'b'
字符串文字组合在一起。主要问题 是对象的__format__()
方法可能返回Unicode数据 与字节字符串不兼容。二进制f字符串首先需要一个解决方案
bytes.format()
。大多数人过去曾提出过这个想法 最近在PEP 461。通常讨论这样一个功能 建议
添加
__bformat__()
之类的方法,以便对象可以控制如何将其转换为字节,或者
bytes.format()
不能像str.format()
那样具有通用性或可扩展性。如果有这样的功能,这两个仍然是未来的选择 是理想的。
答案 1 :(得分:4)
从python 3.6.2开始,这种百分比格式的字节有效:
print(b"Some stuff %a. Some other stuff" % my_byte_or_unicode_string)
答案 2 :(得分:2)
在3.6及更高版本中,您可以执行以下操作:
>>> a = 123
>>> f'{a}'.encode()
b'123'
答案 3 :(得分:0)
我设法格式化文字以通过套接字发送它:
msgIndex = 0
while(IsSomeCondition()):
msgIndex += 1
sock.sendto(
b"msg number %s" % bytes(str(msgIndex), encoding="utf8"),
(receiverIP, receiverPort)
)
# --> b'msg number 1'
# --> b'msg number 2'
# --> b'msg number 3'
我正在使用Python 3.8.5。
答案 4 :(得分:0)
您的建议实际上非常接近;如果您在 encoding
调用中添加一个 bytes()
kwarg,那么您将获得所需的行为:
>>> name = "Hello"
>>> bytes(f"Some format string {name}", encoding="utf-8")
b'Some format string Hello'
警告:这对我来说适用于 3.8,但请注意文档中 Bytes Object 标题的底部似乎表明这应该适用于所有 3.x 中的任何字符串格式化方法(使用 { {1}} 用于版本 <3.6,因为那时添加了 f 字符串,但 OP 专门询问 3.6+)。
答案 5 :(得分:-3)
这是从python 2到python3的更大变化之一。它们以不同的方式处理unicode和字符串。
这是你如何转换为字节。
string = "some string format"
string.encode()
print(string)
这是你解码为字符串的方式。
string.decode()
我对Charles Severence通过这个coursera lecture的Python 2与unicode 3的变化之间的差异有了更好的认识。如果你想了解python 2和3之间的差异以及它们如何处理字符和特别是unicode,你可以观看整个17分钟的视频或快进到10:30左右的某个地方。
我理解您的实际问题是如何格式化具有字符串和字节的字符串。
inBytes = b"testing"
inString = 'Hello'
type(inString) #This will yield <class 'str'>
type(inBytes) #this will yield <class 'bytes'>
在这里你可以看到我有一个字符串变量和一个字节变量。
这是将字节和字符串组合成一个字符串的方法。
formattedString=(inString + ' ' + inBytes.encode())